19

显然,infinity 和 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()函数的情况下正确编码这些数字?也许一些解决方法?

4

5 回答 5

13

您对JSON 规范是正确的:

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

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

这是规范允许的值:

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

false null true

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

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

于 2012-11-27T10:19:44.217 回答
12

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

解决方法:

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

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

于 2012-11-27T10:20:11.413 回答
11

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

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

于 2013-01-31T14:04:32.380 回答
2

作为对较新版本的 PHP >= 5.5.0 的此问题读者的更新,要从中获取INFNANjson_encode被编码为0而不是根本json_encode无法输出,请添加JSON_PARTIAL_OUTPUT_ON_ERROR 选项。

举个例子:json_encode($data, JSON_NUMERIC_CHECK | JSON_PARTIAL_OUTPUT_ON_ERROR);

于 2017-07-26T14:35:17.217 回答
0

上面提到的警告,php文档中报告了官方错误。

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

于 2014-12-26T07:00:28.253 回答