[我正在尝试弄清json序列化出了什么问题,将我的应用程序的当前版本与旧版本一起使用,并发现JSON.stringify()的工作方式上存在一些令人惊讶的差异(使用json中的JSON库.org)。
在我的应用的旧版本中:
JSON.stringify({"a":[1,2]})
给我这个;
"{\"a\":[1,2]}"
在新版本中,>>
JSON.stringify({"a":[1,2]})
给我这个;
"{\"a\":\"[1, 2]\"}"
任何想法都可能使同一库在新版本中的引号括起来吗?
[我正在尝试弄清json序列化出了什么问题,将我的应用程序的当前版本与旧版本一起使用,并发现JSON.stringify()的工作方式上有一些令人惊讶的差异(...
由于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;
}
正如人们指出的,这是由于Prototype.js-1.7之前的特定版本。我也有类似的情况,但是无论是否有Prototype.js,都必须有运行代码。这意味着我不能删除Array.prototype.toJSON,因为我不确定它依赖什么。对于这种情况,这是我想出的最佳解决方案:
如果您不想杀死所有内容,并且拥有在大多数浏览器上都可以使用的代码,则可以这样操作:
ECMAScript 5 and above (Page 201 - the JSON Object, pseudo-code Page 205)中定义的JSON.stringify()函数在对象上可用时使用toJSON()函数。
不会影响其他原型依赖项的可能解决方案是:
编辑以使其更加准确:
我认为更好的解决方案是在原型加载后立即包含此内容
我不太了解原型,但我在docs中看到了这一点:
这是我用于同一问题的代码:
这是我的处理方式。
我的宽容解决方案检查Array.prototype.toJSON是否对JSON字符串化有害,并尽可能保留周围的代码以使其正常工作: