Обработка больших идентификаторов пользователей, возвращаемых FQL в PHP

Я использую 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)