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オブジェクトを復元していませんが、同じブラックボックスを1つ取得しています。

于 2012-06-20T23:25:19.033 に答える
1

制御できないコードは、ページにアクセスする前に元のコードをオーバーライドするため、次の2つのオプションがあります。

iframeを挿入し、contextWindowからJSONを取得します(この編集の時点でこの質問の他の回答に示されているように)、または、https://github.com/douglascrockford/JSON-jsJSONライブラリを使用しますあなた自身の挿入物として。Crockfordを使用すると、ブラウザー間の適合性が保証されますが、ネイティブ実装の方が高速である場合が多いことに注意してください。

将来、問題のあるコードの前にページにアクセスできるようになった場合の代替手段は、問題のある「役立つコード」の前に何かを挿入して、JSONオブジェクトを取得することです。

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