PHP:如何将无穷大或NaN数字编码为JSON?

2022-08-30 20:56:07

显然,无穷大和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()


答案 1

关于 JSON 规范,你是对的:

不允许使用不能表示为数字序列的数值(如无穷大和 NaN)。

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

以下是规范允许的值:

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

false null true

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

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


答案 2

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

解决方法:

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

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


推荐