Поэтому я использую 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 относится к максимальной глубине вложенности по умолчанию.