JSON排除了Infinity和NaN; ECMAScript中的JSON状态?
任何想法为什么JSON遗漏了NaN和+/- Infinity? 它将Javascript置于奇怪的情况下,否则这些对象可能是可序列化的,如果它们包含NaN或+/-无穷大值,则不是。
看起来像这样被抛弃:请参阅RFC4627和ECMA-262(第24.3.2节,JSON.stringify,注释4,第507页,最后一次编辑):
有限数字通过调用ToString(number)
进行字符串化。 无论符号如何, NaN和Infinity都表示为String null
。
Infinity
和NaN
不是关键字或任何特殊的东西,它们只是全局对象的属性(因为是undefined
),因此可以更改。 正是出于这个原因,JSON并没有将它们包含在规范中 - 实际上,如果您使用eval(jsonString)
或JSON.parse(jsonString)
则任何真正的JSON字符串都应该在EcmaScript中具有相同的结果。
如果允许,那么有人可以注入类似的代码
NaN={valueOf:function(){ do evil }};
Infinity={valueOf:function(){ do evil }};
进入一个论坛(或其他),然后任何在该网站上的JSON使用可能会受到影响。
在原始问题上:我同意用户“cbare”,因为这是JSON中的不幸遗漏。 IEEE754将这些定义为浮点数的三个特殊值。 所以JSON不能完全代表IEEE754浮点数。 事实上,情况更糟,因为ECMA262 5.1中定义的JSON甚至没有定义它的数字是否基于IEEE754。 由于ECMA262中为stringify()函数描述的设计流程确实提到了三个特殊的IEEE值,人们可能会怀疑其意图实际上是否支持IEEE754浮点数。
作为另一个数据点,与这个问题无关:XML数据类型xs:float和xs:double表明它们基于IEEE754浮点数,并且它们支持表示这三个特殊值(参见W3C XSD 1.0第2部分,数据类型)。
你可以适应空对象模式,并在你的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中你可以重写序列化方法来实现这样的事情。 不知道你从哪里序列化,所以我不能详细说明如何在序列化方法中实现它。
链接地址: http://www.djcxy.com/p/47919.html上一篇: JSON left out Infinity and NaN; JSON status in ECMAScript?
下一篇: Slashes in php variable not being parsed correctly in javascript