PHP:如何将无限或NaN编码编码为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()函数? 也许有一些解决方法?


根据JSON规范,没有Infinity或NaN值:http://json.org/

解决方法:

  • 拒绝使用JSON(纯JSON),并编写自己的json_encode函数,它将处理INF / NAN(分别转换为“Infinity”和“NaN”),并确保使用类似result = eval('(' + json + ')'); 在客户端。

  • 预先将您的IFN / NAN值转换为字符串值('Infinity'和'NaN'),当您要在JavaScript中使用这些值时,请使用以下构造: var number1 = (+numbers.positive_infinity); 。 这会将字符串值'Infinity'转换为数字Infinity表示。


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

    一种解决方案是将+ inf编码为+ 1e9999,因为在大多数解码器中,它自然会溢出到+ inf,并且与-1e9999的-inf相同。 NaN更难。


    你对JSON规范是正确的:

    不允许用数字序列表示的数字值(如Infinity和NaN)。

    该解决方案还必须来自规范,因为自定义的“JSON”编码器无论如何不会产生有效的JSON(您还必须编写自定义解码器,然后您和数据的使用者将被迫使用该解码器,直到时间到)。

    这里是规范允许的值:

    JSON值必须是一个对象,数组,数字或字符串,或以下三个文字名称之一:

    false null true
    

    因此,任何涉及合法JSON而不是自定义类JSON协议的解决方法都将涉及使用其他内容而不是数字。

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

    链接地址: http://www.djcxy.com/p/47799.html

    上一篇: PHP: How to encode infinity or NaN numbers to JSON?

    下一篇: How to store a Japanese Character in json