恢复重写的window.JSON对象

时间:2012-06-20 23:16:18

标签: javascript json cross-browser

我无法控制的一些代码是覆盖全局JSON对象而不检查它是否已经实现:

var JSON = {
  org: "http://www.JSON.org",
  copyright: "(c)2005 JSON.org",
  license: "http://www.crockford.com/JSON/license.html",
  stringify: function(a, g) {
     ...

问题是这个版本的JSON解析器非常老并且有一个bug,这会影响我的序列化尝试。 (其他人有similar problem这个实现。)

我可以使用浏览器的原生实现吗?我想delete would work,但事实并非如此。我怀疑这是因为JSON是对象而不是method in the prototype。还有其他方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:10)

您可以创建一个iframe元素(将加载about:blank,从而创建一个新的上下文)并从那里获取一个JSON对象。

function restoreJSON() {
  var f = document.createElement("iframe");
  f.style.display = "none";
  document.documentElement.appendChild(f);
  window.JSON = f.contentWindow.JSON;
  document.documentElement.removeChild(f);
}

about:blank是同步加载的,因此无需等待load事件。虽然这不是恢复原始JSON对象,但它会得到一个与之相同的黑盒子。

答案 1 :(得分:1)

由于在您进入页面之前,您无法控制的代码会覆盖原始代码,因此您有两种选择:

注入iframe并从contextWindow中获取JSON(如本编辑时此问题的其他答案所示),或者,只需使用https://github.com/douglascrockford/JSON-js JSON库作为您自己的插入。请注意,使用Crockford确实提供了跨浏览器保证的一致性,但本机实现通常更快。

另一种选择,如果您将来有能力在有问题的代码之前出现在页面上,那就是在之前注入一些冒犯“有助于”获取JSON对象的代码:< / p>

<html>
  <head>
    <script>
      window.myJson = window.JSON;
    </script>
 ....