Sup*_*ova 6 php parsing json numbers bigint
如PHP文档中所述,当json_decode包含长整数的数据结构时,它们将被转换为浮点数.解决方法是使用JSON_BIGINT_AS_STRING,它将它们保留为字符串.当json_encode输入这些值时,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
Run Code Online (Sandbox Code Playgroud)
使用此方法进行正确的数据往返很容易出错.如果属性包含'123'一个应该保留字符串的数字字符串,它将被编码为整数.
我想从服务器获取一个对象,修改一个属性,然后将整个数据结构放回去.我需要保留原始类型.我不想维护我正在操纵的属性.
这有什么真正的解决方法吗?PHP不再存在大的问题,但json_decode例程似乎已经过时了.
只要您的 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}"
Run Code Online (Sandbox Code Playgroud)
如果您需要处理的整数值确实超过了 PHP 的PHP_INT_MAX,则您根本无法用 PHP 本机类型来表示它们。所以没有办法解决你的难题;您不能使用本机类型来跟踪正确的类型,也不能替换其他类型(例如字符串而不是整数),因为在编码回 JSON 时这是不明确的。
在这种情况下,您将不得不发明自己的机制来跟踪每个属性的正确类型,并使用自定义编码器/解码器处理此类序列化。例如,您需要编写一个自定义 JSON 解码器,它可以解码为自定义类,例如new JsonInteger('9223372036854775808'),您的自定义编码器会识别这种类型并将其编码为 JSON9223372036854775808值。
PHP 中没有内置这样的东西。