我试图找出我的json序列化出了什么问题,让我的应用程序的最新版本和旧版本存在一些令人惊讶的差异(使用来自json.org的JSON库) JSON.stringify()的工作方式。
在我的旧版本应用中:
JSON.stringify({"a":[1,2]})
给了我这个;
"{\"a\":[1,2]}"
在新版本中,
JSON.stringify({"a":[1,2]})
给了我这个;
"{\"a\":\"[1, 2]\"}"
你知道在新版本中,是什么原因使得相同的库在数组括号内加上引号吗?
发布于 2010-06-30 18:44:51
由于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;
}
发布于 2011-07-07 21:10:43
在ECMAScript 5 and above (Page 201 - the JSON Object, pseudo-code Page 205)中定义的函数JSON.stringify()在对象上可用时使用函数toJSON()。
由于Prototype.js (或您正在使用的另一个库)定义了一个Array.prototype.toJSON()函数,因此首先使用Array.prototype.toJSON()将数组转换为字符串,然后使用JSON.stringify()引用string,从而导致数组两边出现错误的额外引号。
因此,解决方案简单明了(这是拉斐尔·施韦克特答案的简化版本):
delete Array.prototype.toJSON
这当然会对依赖数组的toJSON()函数属性的库产生副作用。但考虑到与ECMAScript 5的不兼容性,我发现这是一个小小的不便。
必须注意的是,在JSON5中定义的ECMAScript对象在现代浏览器中得到了有效的实现,因此最好的解决方案是遵循标准并修改现有的库。
发布于 2012-12-13 05:17:57
一种不会影响其他原型依赖关系的可能解决方案是:
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;
};
这解决了阵列toJSON与JSON.stringify不兼容的问题,还保留了toJSON功能,因为其他原型库可能会依赖它。
https://stackoverflow.com/questions/710586
复制相似问题