首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Prototype.js中的JSON.stringify()数组奇异性

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

Stack Overflow用户
提问于 2009-04-02 16:48:12
回答 11查看 84.9K关注 0票数 89

我试图找出我的json序列化出了什么问题,让我的应用程序的最新版本和旧版本存在一些令人惊讶的差异(使用来自json.org的JSON库) JSON.stringify()的工作方式。

在我的旧版本应用中:

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

给了我这个;

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

在新版本中,

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

给了我这个;

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

你知道在新版本中,是什么原因使得相同的库在数组括号内加上引号吗?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 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;
}
票数 82
EN

Stack Overflow用户

发布于 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对象在现代浏览器中得到了有效的实现,因此最好的解决方案是遵循标准并修改现有的库。

票数 81
EN

Stack Overflow用户

发布于 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功能,因为其他原型库可能会依赖它。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/710586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档