gpt4 book ai didi

javascript - 注意到 JSON.stringify 的不同实现之间存在奇怪的差异

转载 作者:数据小太阳 更新时间:2023-10-29 04:40:45 32 4
gpt4 key购买 nike

假设我有一个相当嵌套的 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"}
]}
]
};

如果我使用 native 浏览器 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 解码。

谁能详细说明发生了什么以及为什么会出现这种差异?

我错过了什么?

最佳答案

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

这很好用:

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

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

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

关于javascript - 注意到 JSON.stringify 的不同实现之间存在奇怪的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17618791/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com