注意到JSON.stringify的不同实现之间的奇怪区别

Mar*_*iek 7 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", "hours": "5", "amount": "$25.00"}
        ]}
    ] 
};
Run Code Online (Sandbox Code Playgroud)

如果我使用本机浏览器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"
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试在使用PrototypeJSjson2.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\"}]}]"
}
Run Code Online (Sandbox Code Playgroud)

显然,上面是一个问题,因为它没有JSON解码到最初传递给的同一个对象JSON.stringify.

任何人都可以详细说明发生了什么以及为什么会出现这种差异?

我错过了什么?

geo*_*org 7

这是因为本机JSON.stringify尊重toJSON方法,Prototype将这些方法添加到各处.不幸的是,本机和原型似乎明白toJSON以不同的方式:同时原生期望它返回一个字符串,它被用作字面值,样机的toJSON使用这意味着已经格式化JSON的回报大块原样.因此存在差异.

这很好用:

delete Array.prototype.toJSON;
document.getElementById('out').innerHTML += JSON.stringify(foo);
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/Ky3tv/2/

此外,这似乎在原型1.7中得到修复.我猜他们现在正在检查原生JSON,然后再添加他们的toJSON方法.