Ответ 1
json_decode() может преобразовывать большие целые числа в строки, если вы укажете флаг в вызове функции:
$array = json_decode($json, true, 512, JSON_BIGINT_AS_STRING)
Я использую FQL для извлечения списка пользователей из Facebook. Для согласованности я получаю результат как JSON. Это вызывает проблему - поскольку возвращенный JSON кодирует идентификаторы пользователя в виде чисел, json_decode() преобразует эти числа в значения с плавающей запятой, потому что некоторые из них слишком велики, чтобы вписаться в int; конечно, мне нужны эти идентификаторы как строки.
Так как json_decode() делает свою собственную вещь, не принимая никаких флагов поведения, я в недоумении. Любые предложения по устранению этого?
json_decode() может преобразовывать большие целые числа в строки, если вы укажете флаг в вызове функции:
$array = json_decode($json, true, 512, JSON_BIGINT_AS_STRING)
Я решил проблему, добавив &format=json-strings
к моему вызову api FQL, например:
$myQuery = "SELECT uid2 FROM friend WHERE uid1=me()";
$facebook->api("/fql?q=" . urlencode($myQuery) . "&format=json-strings")
Это говорит facebook обернуть все числа в кавычках, что приводит к тому, что json_decode не использует ни int-s не плавает.
Поскольку я боялся, что эта проблема не ограничивается FQL, но ко всем вызовам API Графа, которые предпочитают представлять некоторые из ID как BIG-INT, я дошел до того, что исправил PHPKK на PHP, чтобы заставить 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);
в ваше приложение PHPphp_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)