Обработка больших идентификаторов пользователей, возвращаемых FQL в PHP - PullRequest
19 голосов
/ 25 мая 2010

Я использую FQL для получения списка пользователей из Facebook. Для согласованности я получаю результат в формате JSON. Это вызывает проблему - поскольку возвращаемый JSON кодирует идентификаторы пользователей в виде чисел, json_decode () преобразует эти числа в значения с плавающей запятой, поскольку некоторые из них слишком велики, чтобы поместиться в int; Конечно, мне нужны эти идентификаторы в виде строк.

Поскольку json_decode () делает свое дело, не принимая никаких флагов поведения, я в растерянности. Любые предложения о том, как решить эту проблему?

Ответы [ 6 ]

28 голосов
/ 28 мая 2010

json_decode () может преобразовывать большие целые числа в строки, если в вызове функции указан флаг:

$array = json_decode($json, true, 512, JSON_BIGINT_AS_STRING)
20 голосов
/ 18 ноября 2011

Я решил проблему, добавив &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 графа, которые выбирают для представления некоторых идентификаторов в качестве BIG-INT, я пошел до того, что немного исправил PHP SDK Facebook, чтобы заставить Facebook вернуться все его числа в виде строк.

Я добавил эту одну строку в функцию _graph. Это будет строка 738 в facebook_base.php, версия 3.1.1

$params['format'] = 'json-strings';

Конечно исправить

8 голосов
/ 12 ноября 2011

У меня была похожая проблема, когда json_decode конвертировал последние идентификаторы твиттера / твита в экспоненциальные числа.

Ответ Бьёрна великолепен, если вы хотите, чтобы ваш BIGINT стал строкой и имел PHP 5.3+. Если ни одна из этих вещей не верна, другой вариант - повысить точность плавающего в PHP. Это можно сделать несколькими разными способами ...

  • найдите значение precision в вашем php.ini и измените его на precision = 20
  • добавить ini_set('precision', 20); в ваше приложение PHP
  • добавить php_value precision 20 в файл .htaccess вашего приложения или в файл виртуального хоста
5 голосов
/ 25 мая 2010

Быстро и грязно, кажется, сейчас работает:

$sJSON = preg_replace('/:(\d+)/', ':"${1}"', $sJSON);
3 голосов
/ 18 января 2012

Я использую это, и оно работает почти отлично.

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);
0 голосов
/ 03 июня 2014

Это (preg_replace('/("\w+"):(\d+)(.\d+)?/', '\\1:"\\2\\3"', $json);) работает для меня (для анализа результата из API Facebook)

...