Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

$array = json_decode($json, true, 512, JSON_BIGINT_AS_STRING)

Ответ 2

Я решил проблему, добавив &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';

Уверенное исправление

Ответ 3

У меня была аналогичная проблема, когда 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 или файл виртуального хоста

Ответ 4

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

$sJSON = preg_replace('/:(\d+)/', ':"${1}"', $sJSON);

Ответ 5

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

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);

Ответ 6

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