PHP:如何编码无穷大或NaN号码JSON?(PHP: How to encode infinity or NaN numbers to JSON?)

显然,无穷大和NaN不是JSON规范的一部分,所以这个PHP代码:

$numbers = array();
$numbers ['positive_infinity'] = +INF;
$numbers ['negative_infinity'] = -INF;
$numbers ['not_a_number'] = NAN;
$array_print = print_r ($numbers, true);
$array_json = json_encode ($numbers);
echo "\nprint_r(): $array_print";
echo "\njson_encode(): $array_json";

这产生:

PHP Warning:  json_encode(): double INF does not conform to the JSON spec, encoded as 0 in /home/septi/test.php on line 8
PHP Warning:  json_encode(): double -INF does not conform to the JSON spec, encoded as 0 in /home/septi/test.php on line 8
PHP Warning:  json_encode(): double NAN does not conform to the JSON spec, encoded as 0 in /home/septi/test.php on line 8

print_r(): Array
(
    [positive_infinity] => INF
    [negative_infinity] => -INF
    [not_a_number] => NAN
)

json_encode(): {"positive_infinity":0,"negative_infinity":0,"not_a_number":0}

有没有什么办法,以正确编码,这些数字没有写我自己的json_encode()函数? 也许一些解决方法吗?

Answer 1:

据JSON规范,不存在无穷大或NaN值: http://json.org/

解决方法:

  1. 拒绝使用JSON(纯JSON),并写自己的json_encode函数,该函数将处理INF / NAN(转换为“无限”和“南”分别),并确保你正在使用类似解析JSON result = eval('(' + json + ')'); 在客户端。

  2. 预转换您IFN / NaN值转换为字符串值(“无限”和“男”),而当你要在JavaScript中的值进行操作,请使用以下建设: var number1 = (+numbers.positive_infinity); 。 这将转换成字符串值“无限”为数字Infinity的表示。



Answer 2:

你说得对有关JSON规范

不能被表示为数字(如无限大和NaN)序列数值是不允许的。

该解决方案还必须来自规范,因为定制的“JSON”编码器将不会反正产生有效的JSON(你会写一个自定义的解码器为好,然后你和你的数据的消费者将被迫使用,直到时间到)。

下面是什么规范允许值:

甲JSON值必须是一个对象,数组编号,或串,或以下三个字面名称之一:

 false null true 

因此,涉及的不是自定义类JSON协议的法律JSON任何解决办法将涉及使用的东西,而不是数人。

一种合理的选择是使用字符串"Infinity""NaN"对于这些边缘情况。



Answer 3:

这在我看来是JSON的一大缺憾。 不同的JSON编码器处理这个不同,简要概述可以在这里找到: http://lavag.org/topic/16217-cr-json-labview/?p=99058

一种解决方案是+ INF编码为+在大多数解码器自然溢出到+ INF 1e9999作为将和与相同的-INF -1e9999。 楠更难。



Answer 4:

警告上面提到的,还有PHP文件中报道的官方漏洞。

https://bugs.php.net/bug.php?id=64695



Answer 5:

作为更新这个问题的读者PHP> = 5.5.0的更新版本,以获得INFNAN从值json_encode为编码0 ,而不是json_encode未能输出可言,加上JSON_PARTIAL_OUTPUT_ON_ERROR选项。

作为一个例子: json_encode($data, JSON_NUMERIC_CHECK | JSON_PARTIAL_OUTPUT_ON_ERROR);



标签

每周VPS推荐 总有一款是你需要的!

没有找到想要的?点击这里去栏目页查看所有|点击这里搜索更多

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
如果有服务商和本站有合作意向,可以联系站长,QQ:121274060|邮箱:admin@e-learn.cn
了解到有朋友期望能在易学教程发布文章,奈何用户发布系统不完善,所以开通了码农岛,以供发布文章的需求
商务合作  |  商家投稿  |  易学教程交流群