7

我无法控制的一些代码覆盖了全局 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 解析器非常旧并且有一个错误,这妨碍了我对序列化的尝试。(其他人对此实现也有类似的问题。)

我可以了解浏览器的本机实现吗?我认为删除会起作用,但事实并非如此。我怀疑这是因为 JSON 是一个对象,而不是原型中的方法。有没有其他方法可以解决它?

4

2 回答 2

11

您可以创建一个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 对象,但它会得到一个与其相同的黑盒。

于 2012-06-20T23:25:19.033 回答
1

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

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

如果您将来有能力在有问题的代码之前出现在页面上,另一种方法是在有问题的“有助于获取 JSON 对象的代码”之前注入一些东西:

<html>
  <head>
    <script>
      window.myJson = window.JSON;
    </script>
 ....
于 2012-06-20T23:19:15.700 回答