注意到JSON.stringify的不同实现之间有一个奇怪的差异
Noticing an odd difference between different implementations of JSON.stringify
假设我有一个像这样嵌套的JS对象,我需要对它进行JSON编码:
var foo = {
"totA": -1,
"totB": -1,
"totC": "13,052.00",
"totHours": 154,
"groups": [
{"id": 1,
"name": "Name A",
"billingCodes": [
{"bc": "25", "type": "hours", "hours": "5", "amount": "$25.00"}
]}
]
};
如果我使用本地浏览器JSON.stringify
(在Chrome、Firefox、IE9/10中测试)对其进行JSON编码,我会返回一个JSON字符串,如下所示(这就是我所期望的):
原生JSON.stringify JSFiddle示例
{
"totA": -1,
"totB": -1,
"totC": "13,052.00",
"totHours": 154,
"groups": [
{
"id": 1,
"name": "Name A",
"billingCodes": [
{
"bc": "25",
"type": "hours",
"hours": "5",
"amount": "$25.00"
}
]
}
]
}
如果我试图在一个使用PrototypeJS或json2.js的页面上做同样的事情,就会出现奇怪的情况
在这种情况下,同一对象上的JSON.stringify
会返回以下JSON:
ProtypeJS JSON.stringify JSFiddle示例
{
"totA": -1,
"totB": -1,
"totC": "13,052.00",
"totHours": 154,
"groups": "[{'"id'": 1, '"name'": '"Name A'", '"billingCodes'": [{'"bc'": '"25'", '"type'": '"hours'", '"hours'": '"5'", '"amount'": '"$25.00'"}]}]"
}
显然,上述内容是一个问题,因为它没有对最初传递给JSON.stringify
的同一对象进行JSON解码。
有人能详细说明发生了什么以及为什么会有这种差异吗?
我错过了什么?
这是因为原生JSON.stringify
尊重toJSON
方法,而Prototype在所有地方都添加了这些方法。不幸的是,native和Prototype似乎以不同的方式理解toJSON
:虽然native希望它返回一个字符串,该字符串用作文字值,但Prototype的toJSON
返回的是已经格式化的JSON块,这些JSON块本应按原样使用。因此存在差异。
这很好:
delete Array.prototype.toJSON;
document.getElementById('out').innerHTML += JSON.stringify(foo);
http://jsfiddle.net/Ky3tv/2/
此外,这似乎在原型1.7中得到了修复。我猜他们在添加toJSON
方法之前,现在正在检查原生JSON。
相关文章:
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- 如何在只能有一个asp.net表单的主页上从asp.net页面中的javascript中获取值
- 有可能在来自链接的警报中有一个值吗
- 是否<asp:文本框>有一个onFocusLost事件
- 让谷歌数据图表有一个24小时x轴
- PayPal按钮是否有一个简单的选项,其中金额基于一些用户输入
- 我确实有一个表单,如果用户输入了输入,它应该检查否定或空的输入框,并抛出一条警告消息
- 在这个使用hasOwnProperty的对象扩展程序中有一个错误,I'我不确定那个bug是什么,也不确定这个扩展
- 当知道同一hiearch中至少有一个元素时,遍历到元素.结构使用jquery
- PNG图像被覆盖,但每个图像都有一个链接可以更改,每次一个-Javascript/jQuery/CSS
- JQuery是否有一个“;移动“;作用或者有没有一种更紧凑的方法来做到这一点
- Regex或javascript每X个连续单词中有一个单词
- Jquery时间启动计时器,我有一个计时器的代码,但它在页面加载时启动
- 是否有一个javascript库来解析简单的查询
- 在 2 台计算机之间建立连接,中间有一个网站
- 使用$(“[property=value]”).click(),我希望两次单击之间有一个延迟
- 注意到JSON.stringify的不同实现之间有一个奇怪的差异
- RegExp只允许单词之间有一个空格
- 我如何有一个淡出动画时切换选项卡之间
- 是否有可能在两个自调用函数之间有一个公共变量?