Я использую FQL для извлечения списка пользователей из Facebook. Для согласованности я получаю результат как JSON. Это вызывает проблему – поскольку возвращенный JSON кодирует идентификаторы пользователя в виде чисел, json_decode () преобразует эти числа в значения с плавающей запятой, потому что некоторые из них слишком велики, чтобы вписаться в int; конечно, мне нужны эти идентификаторы как строки.
Поскольку json_decode () делает свою собственную вещь без принятия каких-либо флагов поведения, я в недоумении. Любые предложения по устранению этого?
json_decode () может преобразовывать большие целые числа в строки, если вы укажете флаг в вызове функции:
$array = json_decode($json, true, 512, JSON_BIGINT_AS_STRING)
Я решил проблему, добавив &format=json-strings
к моему вызову FQL api, например:
$myQuery = "SELECT uid2 FROM friend WHERE uid1=me()"; $facebook->api("/fql?q=" . urlencode($myQuery) . "&format=json-strings")
Это говорит facebook обернуть все числа в кавычках, что приводит к тому, что json_decode не использует ни int-s, ни float.
Поскольку я боялся, что эта проблема не ограничивается FQL, но для всех вызовов API графиков, которые предпочитают представлять некоторые идентификаторы в виде BIG-INT, я дошел до того, что исправил PHP SDK для Facebook немного, чтобы заставить Facebook вернуть все свои числа как строки.
Я добавил эту строку в функцию _graph
. Это будет строка 738 в facebook_base.php, версия 3.1.1
$params['format'] = 'json-strings';
Уверенное исправление
У меня была аналогичная проблема, когда json_decode
конвертировал последние идентификаторы твиттера / твита в экспоненциальные числа.
Ответ Björn велик, если вы хотите, чтобы ваш BIGINT стал строкой – и PHP 5.3+. Если ни одна из этих вещей не верна, другой вариант заключается в повышении точности PHP-float. Это можно сделать разными способами …
precision
в вашем php.ini и измените его на precision = 20
ini_set('precision', 20);
к вашему PHP-приложению php_value precision 20
в файл .htaccess или файл виртуального хоста вашего приложения. Быстро и грязно, похоже, работает сейчас:
$sJSON = preg_replace('/:(\d+)/', ':"${1}"', $sJSON);
Я использую это, и он работает почти отлично.
json_decode(preg_replace('/("\w+"):(\d+)/', '\\1:"\\2"', $jsonString), true)
Json ломается, когда включены геоданные, например. {"lat":54.2341}
приводит к "lat":"54".2341
Решение:
$json = preg_replace('/("\w+"):(\d+)(.\d+)?/', '\\1:"\\2\\3"', $json);
Это (preg_replace('/("\w+"):(\d+)(.\d+)?/', '\\1:"\\2\\3"', $json);)
работал для меня ( для анализа результата из facebook api)