知道为什么JSON省略了NaN和+/- Infinity吗?它将Javascript置于一种奇怪的情况中,如果对象包含NaN或+/-无穷大值,则对象将不可序列化。
看起来这已经是铁板一块了:参见RFC4627和ECMA-262(第24.5.2节,JSON。ECMA-262 pdf最后一次编辑第683页):
有限数字被字符串化,就像调用ToString(number)一样。NaN和Infinity,无论符号是什么,都表示为字符串null。
知道为什么JSON省略了NaN和+/- Infinity吗?它将Javascript置于一种奇怪的情况中,如果对象包含NaN或+/-无穷大值,则对象将不可序列化。
看起来这已经是铁板一块了:参见RFC4627和ECMA-262(第24.5.2节,JSON。ECMA-262 pdf最后一次编辑第683页):
有限数字被字符串化,就像调用ToString(number)一样。NaN和Infinity,无论符号是什么,都表示为字符串null。
当前回答
如果你像我一样无法控制序列化代码,你可以用null或任何其他值来处理NaN值,如下所示:
$.get("file.json", theCallback)
.fail(function(data) {
theCallback(JSON.parse(data.responseText.replace(/NaN/g,'null')));
} );
本质上,当原始json解析器检测到无效令牌时,.fail将被调用。然后使用字符串replace替换无效的令牌。在我的情况下,它是一个例外的序列化器返回NaN值,所以这个方法是最好的方法。如果结果通常包含无效令牌,最好不要使用$。而不是手动检索JSON结果,并始终运行字符串替换。
其他回答
如果你像我一样无法控制序列化代码,你可以用null或任何其他值来处理NaN值,如下所示:
$.get("file.json", theCallback)
.fail(function(data) {
theCallback(JSON.parse(data.responseText.replace(/NaN/g,'null')));
} );
本质上,当原始json解析器检测到无效令牌时,.fail将被调用。然后使用字符串replace替换无效的令牌。在我的情况下,它是一个例外的序列化器返回NaN值,所以这个方法是最好的方法。如果结果通常包含无效令牌,最好不要使用$。而不是手动检索JSON结果,并始终运行字符串替换。
如果您可以访问序列化代码,则可以将Infinity表示为1.0e+1024。指数太大,不能用双精度表示,反序列化时,它表示为无穷大。适用于webkit,不确定其他json解析器!
你能适应空对象模式,并在JSON中表示这样的值吗
"myNum" : {
"isNaN" :false,
"isInfinity" :true
}
然后在检查时,可以检查类型
if (typeof(myObj.myNum) == 'number') {/* do this */}
else if (myObj.myNum.isNaN) {/* do that*/}
else if (myObj.myNum.isInfinity) {/* Do another thing */}
我知道在Java中,你可以重写序列化方法来实现这样的事情。不确定你的序列化从哪里来,所以我不能详细说明如何在序列化方法中实现它。
原因在标准ECMA-404 JSON数据交换语法第1版的第2页说明
JSON is agnostic about numbers. In any programming language, there can be a variety of number types of various capacities and complements, fixed or floating, binary or decimal. That can make interchange between different programming languages difficult. JSON instead offers only the representation of numbers that humans use: a sequence of digits. All programming languages know how to make sense of digit sequences even if they disagree on internal representations. That is enough to allow interchange.
原因并不像许多人声称的那样,是由于NaN和Infinity ECMA脚本的表示。简单性是JSON的核心设计原则。
因为它非常简单,所以JSON语法不会发生任何变化。这为JSON(作为一种基本表示法)提供了极大的稳定性
JSON5允许使用标准的Javascript符号来表示正无穷大和负无穷大、NaN以及许多其他在JSON中被省略的有效ECMAScript(后面的逗号等)。
https://json5.org/
这使得JSON成为一种更有用的格式。
然而,无论是使用JSON还是JSON5:出于安全原因,总是总是解析——不要计算!!