微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

json_decode和json_encode长整数而不丢失数据

如何解决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}"

如果您需要处理的整数值确实超过了PHPPHP_INT_MAX,那么您根本 无法PHP本机类型表示它们。因此,您无法解决难题。您不能使用本机类型来跟踪正确的类型,也不能替换其他类型(例如,字符串而不是整数),因为在编码回JSON时,这是模棱两可的。

在这种情况下,您将必须发明自己的机制来跟踪每个属性的正确类型,并使用自定义编码器/解码器处理此类序列化。例如,您需要编写一个自定义JSON解码器,该解码器可以解码为自定义类,例如new JsonInteger('9223372036854775808'),而您的自定义编码器会识别该类型并将其编码为JSON9223372036854775808值。

PHP中没有内置这样的东西。

解决方法

如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

使用此方法进行正确的数据往返很容易出错。如果属性包含'123',则数字字符串应保留为字符串,它将被编码为整数。

我想从服务器获取一个对象,修改一个属性,然后将整个数据结构放回去。我需要保留原始类型。除了要处理的属性外,我不想保留其他属性。

有没有真正的解决方法?PHP不再有任何关于int的问题,但是json_decode例程似乎已经过时了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。