知道为什么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。
当前回答
你能适应空对象模式,并在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中,你可以重写序列化方法来实现这样的事情。不确定你的序列化从哪里来,所以我不能详细说明如何在序列化方法中实现它。
其他回答
你能适应空对象模式,并在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中,你可以重写序列化方法来实现这样的事情。不确定你的序列化从哪里来,所以我不能详细说明如何在序列化方法中实现它。
字符串“Infinity”、“-Infinity”和“NaN”都被强制转换为JS中的期望值。所以我认为在JSON中表示这些值的正确方法是字符串。
> +"Infinity"
Infinity
> +"-Infinity"
-Infinity
> +"NaN"
NaN
JSON太可惜了。Stringify默认情况下不这样做。但有一个办法:
> JSON.stringify({ x: Infinity }, function (k,v) { return v === Infinity ? "Infinity" : v; })
"{"x":"Infinity"}"
如果您可以访问序列化代码,则可以将Infinity表示为1.0e+1024。指数太大,不能用双精度表示,反序列化时,它表示为无穷大。适用于webkit,不确定其他json解析器!
当前的IEEE Std 754-2008包含了两种不同的64位浮点表示形式的定义:十进制64位浮点类型和二进制64位浮点类型。
在舍入字符串后,.99999990000000006与IEEE二进制64位表示中的.9999999相同,但与IEEE十进制64位表示中的.9999999不同。在64位IEEE十进制浮点数中,.99999990000000006舍入为值.9999999000000001,这与十进制值.9999999不相同。
由于JSON只是将数值视为十进制数字的数字字符串,因此同时支持IEEE二进制和十进制浮点表示的系统(如IBM Power)无法确定两个可能的IEEE数字浮点值中的哪一个是要使用的。
JSON5允许使用标准的Javascript符号来表示正无穷大和负无穷大、NaN以及许多其他在JSON中被省略的有效ECMAScript(后面的逗号等)。
https://json5.org/
这使得JSON成为一种更有用的格式。
然而,无论是使用JSON还是JSON5:出于安全原因,总是总是解析——不要计算!!