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);



标签