Javascript 注意到JSON.stringify的不同实现之间的奇怪差异

Javascript 注意到JSON.stringify的不同实现之间的奇怪差异,javascript,json,Javascript,Json,假设我有一个类似这样的嵌套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"

假设我有一个类似这样的嵌套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
会返回以下JSON:

显然,上面的问题是因为它不会对最初传递给
JSON.stringify
的同一个对象进行JSON解码

有人能详细说明发生了什么以及为什么会有这种差异吗


我遗漏了什么?

这是因为native
JSON.stringify
尊重
toJSON
方法,Prototype到处添加了这些方法。不幸的是,native和Prototype似乎以不同的方式理解
toJSON
:虽然native希望它返回一个字符串,用作文本值,但Prototype的
toJSON
返回已格式化的JSON块,这些块将按原样使用。因此存在差异

这很好:

delete Array.prototype.toJSON;
document.getElementById('out').innerHTML += JSON.stringify(foo);


此外,这似乎在原型1.7中得到了修复。我猜他们在添加
到JSON
方法之前正在检查本机JSON。

看起来可能是个bug,将Fiddle改为使用Prototype 1.7.1似乎产生了预期的结果。看这个:看起来它只是对整个
数组进行了JSON编码。重复。。。从这个问题的答案来看,
delete Array.prototype.toJSON
Yup,绝对是个傻瓜。谢谢@crazy Train我想他是在问为什么会有不同。
{
    "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\"}]}]"
}
delete Array.prototype.toJSON;
document.getElementById('out').innerHTML += JSON.stringify(foo);