Как обойти или заставить PHP json_decode не изменять мои очень большие целочисленные значения?

Поэтому я использую php 5.2.6 в среде WAMP.

Я пытаюсь использовать функцию json_decode для создания строки json в массиве. JSON исходит из REST API в другом месте, поэтому я не контролирую форматирование строки JSON. Вот пример одной из строк json, которую я пытаюсь использовать:

[{ "webinarKey":795855906, "sessionKey":100000000041808257, "startTime":"2011-12-16T13:56:15Z", "endTime":"2011-12-16T14:48:37Z", "registrantsAttended":2 }] 

Я специально после значения sessionKey здесь. PHP обрабатывает значение как float, и я не могу ничего сделать, чтобы получить исходное значение.

Я пробовал следующее:

 json_decode($json, true, 512, JSON_BIGINT_AS_STRING); # This produces the following error because my php version isn't up to snuff and I # can't upgrade to the version required # Warning: json_decode() expects at most 2 parameters, 4 given 

Я также пробовал это:

 $json_obj = json_decode($json, true); number_format($json_obj[0]["sessionKey"], 0, '.', ''); # This results in precision issues where the value was 100000000041808257 # but is number_formated out as 100000000041808256 

Как я уже сказал, обновление до php 5.4 (где поддерживается 4-й параметр json_decode call) не является вариантом. Пожалуйста помоги!

Благодаря!

Для качественного использования JSON используйте:

 // wrap numbers $json = preg_replace('/:\s*(\-?\d+(\.\d+)?([e|E][\-|\+]\d+)?)/', ': "$1"', $json); // as object $object = json_decode($json); // as array $array = json_decode($json, true); 

Спасибо @Scott Gottreu и @pospi.

Ответ был в последнем комментарии к принятому ответу на этот вопрос .

Используйте функцию preg_replace (), чтобы окружать все целые значения кавычками.

 json_decode(preg_replace('/("\w+"):(\d+)/', '\\1:"\\2"', $jsonString), true); 

Фактически после тестирования вышеприведенной строки он закручивает JSON с номерами с плавающей запятой в качестве значений, поэтому для исправления этой проблемы я использовал следующее, чтобы просто заключить все числа (числа целых чисел или чисел с плавающей запятой) в кавычки:

 json_decode(preg_replace('/("\w+"):(\d+(\.\d+)?)/', '\\1:"\\2"', $jsonString), true); 

Тем временем PHP исправил эту проблему … ну как-то. Начиная примерно с PHP 5.4, они добавили опцию, которая делает то, что делают вышеперечисленные решения Regex:

 json_decode($json, false, 512, JSON_BIGINT_AS_STRING); 

512 относится к максимальной глубине вложенности по умолчанию.