JSON.strgify()数组与ProtoType.js异常如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

我试图找出我的json序列化出了什么问题,让我的应用程序的当前版本和旧版本一起,并且在JSON.stringify()方法中找到了一些令人惊讶的差异(使用json.org的JSON库)。

在我的应用程序的旧版本中:

 JSON.stringify({"a":[1,2]})

给我这个;

"{\"a\":[1,2]}"

在新版本中,

 JSON.stringify({"a":[1,2]})

给我这个;

"{\"a\":\"[1, 2]\"}"

任何想法可以改变,以使相同的库在新版本中的数组括号周围引号?

提问于
用户回答回答于

由于JSON.stringify最近一直在与一些浏览器一起发布,我建议使用它而不是Prototype的toJSON。然后,将检查window.JSON && window.JSON.stringify,并且只包含json.org库,否则(通过document.createElement('script')...)。要解决不兼容问题,请使用:

if(window.Prototype) {
    delete Object.prototype.toJSON;
    delete Array.prototype.toJSON;
    delete Hash.prototype.toJSON;
    delete String.prototype.toJSON;
}
用户回答回答于

ECMAScript 5及更高版本中定义的函数JSON.stringify(),在对象上可用时使用函数toJSON()。

因为Prototype.js(或者你正在使用的另一个库)定义了一个Array.prototype.toJSON()函数,所以首先使用Array.prototype.toJSON()将数组转换为字符串,然后使用JSON.stringify()引用字符串,数组周围不正确的额外引号。

因此,解决方案简单直接(这是Raphael Schweikert的答案的简化版本):

delete Array.prototype.toJSON

这对依赖于数组的toJSON()函数属性的库产生了一定的副作用。但考虑到与ECMAScript 5不兼容,我觉得这是一个小小的不便。

必须注意的是,ECMAScript 5中定义的JSON对象在现代浏览器中有效实现,因此最好的解决方案是符合标准并修改现有的库。

扫码关注云+社区