Intereting Posts
Показывать подкатегорию вместо Root в меню Строка в массив целых чисел php не удалось обработать запрос ajax из небольшого модуля чата Kohana 3: Пример модели с проверкой Настройка базы данных ACL CakePHP: структура ARO / ACO? Итерация php-массива и конкатенация CakePHP вложенные два запроса Как преобразовать строку, которая выглядит как шестнадцатеричный номер, в фактический шестнадцатеричный номер в php? Ошибка при выполнении ассемблерного дампа (ошибка синтаксического анализа: сбой в `&: extend (.clearfix all);`) Как я могу остановить HTTP из экранов кавычек? Запросы HTTPS с curl или file_get_contents вызывают сбой php PHPExcel создает «нечитаемый контент» Измените размер изображения без искажения, сохраняя пропорции, а затем избыток урожая с помощью WideImage Переназначить index.php в CodeIgniter Как использовать именованные каналы в PHP между различными функциями или даже разными процессами без fork?

json_decode И json_encode длинные целые числа без потери данных

Как отмечено в документации PHP, когда json_decode использует структуру данных, содержащую длинные целые числа, они будут преобразованы в float. Обходной путь заключается в использовании JSON_BIGINT_AS_STRING , который вместо этого сохраняет их как строки. Когда json_encode JSON_NUMERIC_CHECK такие значения, JSON_NUMERIC_CHECK будет кодировать эти числа обратно в большие целые числа:

 $json = '{"foo":283675428357628352}'; $obj = json_decode($json, false, JSON_BIGINT_AS_STRING); $json2 = json_encode($obj, JSON_NUMERIC_CHECK); var_dump($json === $json2); // true 

Использование этого метода для правильного округления данных подвержено ошибкам. Если свойство содержит '123' , числовую строку, которая должна содержать строку, она будет закодирована в целое число.

Я хочу получить объект с сервера, изменить одно свойство и вернуть всю структуру данных. Мне нужно сохранить исходные типы. Я не хочу поддерживать свойства, отличные от того, с которым я манипулирую.

Есть ли какое-нибудь реальное обходное решение для этого? У PHP больше нет проблем с большими ints, но процедура json_decode похоже, устарела.

Related of "json_decode И json_encode длинные целые числа без потери данных"

Пока ваша PHP-версия может обрабатывать большие целые числа, то есть если вы используете 64-разрядную версию PHP (на чем-то, отличном от Windows ) , json_decode не имеет с этим проблем:

 $json = '{"foo":9223372036854775807}'; $obj = json_decode($json); $json2 = json_encode($obj); var_dump(PHP_INT_MAX, $obj, $json2); int(9223372036854775807) object(stdClass)#1 (1) { ["foo"]=> int(9223372036854775807) } string(27) "{"foo":9223372036854775807}" 

Если целочисленные значения, которые необходимо обработать, превышают PHP_INT_MAX PHP, вы просто не можете представлять их в родных типах PHP. Так что у вас нет головоломки; вы не можете использовать собственные типы для отслеживания правильного типа, и вы не можете подставлять другие типы (например, строки вместо целых чисел), потому что это неоднозначно при кодировании обратно в JSON.

В этом случае вам придется придумать свой собственный механизм отслеживания правильных типов для каждого свойства и обработать такую ​​сериализацию с помощью пользовательского кодировщика / декодера. Например, вам нужно будет написать пользовательский JSON-декодер, который может декодироваться в пользовательский класс, например new JsonInteger('9223372036854775808') , и ваш пользовательский кодер распознает этот тип и закодирует его до значения JSON 9223372036854775808 .

В PHP нет такой вещи.