猿问

与Prototype.js的JSON.stringify()数组奇异性

与Prototype.js的JSON.stringify()数组奇异性

我正在试图找出我的json序列化出了什么问题,使用我的应用程序的当前版本和旧版本,并且在JSON.stringify()的工作方式中发现了一些令人惊讶的差异(使用来自json.org的JSON库) )。

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

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

给了我这个;

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

在新版本中,

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

给了我这个;

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

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


翻翻过去那场雪
浏览 516回答 3
3回答

函数式编程

ECMAScript 5及更高版本(第201页 - JSON对象,伪代码页面205)中定义的函数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对象在现代浏览器中有效实现,因此最佳解决方案是符合标准并修改现有库。

噜噜哒

一个不会影响其他Prototype依赖的可能解决方案是:var _json_stringify = JSON.stringify;JSON.stringify = function(value) {     var _array_tojson = Array.prototype.toJSON;     delete Array.prototype.toJSON;     var r=_json_stringify(value);     Array.prototype.toJSON = _array_tojson;     return r;};这会处理与JSON.stringify不兼容的Array toJSON,并且还会保留toJSON功能,因为其他Prototype库可能依赖于它。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答