假设我有一个相当嵌套的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字符串(这是我期望的):
Native JSON.stringify JSFiddle example
{
"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 example
{
"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解码。
任何人都可以详细说明发生了什么以及为什么会出现这种差异?
我错过了什么?
答案 0 :(得分:7)
这是因为原生JSON.stringify
尊重toJSON
方法,Prototype将这些方法添加到了所有地方。不幸的是,native和Prototype似乎以不同的方式理解toJSON
:虽然native希望它返回一个字符串,它被用作文字值,Prototype的toJSON
返回大块的已经格式化的JSON,意在按原样使用。因此存在差异。
这很好用:
delete Array.prototype.toJSON;
document.getElementById('out').innerHTML += JSON.stringify(foo);
此外,这似乎在原型1.7中得到修复。我猜他们现在在添加toJSON
方法之前检查原生JSON。