带有Prototype.js的JSON.stringify()数组异常现象

问题描述 投票:87回答:11

[我正在尝试弄清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()的工作方式上有一些令人惊讶的差异(...

javascript json prototypejs
11个回答
80
投票

由于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;
}

1
投票

正如人们指出的,这是由于Prototype.js-1.7之前的特定版本。我也有类似的情况,但是无论是否有Prototype.js,都必须有运行代码。这意味着我不能删除Array.prototype.toJSON,因为我不确定它依赖什么。对于这种情况,这是我想出的最佳解决方案:


0
投票

如果您不想杀死所有内容,并且拥有在大多数浏览器上都可以使用的代码,则可以这样操作:


78
投票

ECMAScript 5 and above (Page 201 - the JSON Object, pseudo-code Page 205)中定义的JSON.stringify()函数在对象上可用时使用toJSON()函数。


15
投票

不会影响其他原型依赖项的可能解决方案是:


9
投票

编辑以使其更加准确:


4
投票

我认为更好的解决方案是在原型加载后立即包含此内容


2
投票

我不太了解原型,但我在docs中看到了这一点:


2
投票

这是我用于同一问题的代码:


1
投票

这是我的处理方式。


1
投票

我的宽容解决方案检查Array.prototype.toJSON是否对JSON字符串化有害,并尽可能保留周围的代码以使其正常工作:

© www.soinside.com 2019 - 2024. All rights reserved.