3

次の JSON があります: http://pastebin.com/Sh20StJY

SOは私の投稿の文字を削除したので、実際のJSONのリンクを見てください

JSON.stringifyこれは、Firefox の設定 ( pref.setCharPref(prefName, value);)を使用して生成および保存されました。

問題は、値を保存すると、Firefox が JSON を破損する処理を行うことです。JSON.parse構成から値を取得しようとすると、エラーが発生します。

Error: JSON.parse: bad control character in string literal

上記の JSON (設定から取得したもの) を検証しようとするline 20と、トークンの値に 2 つの無効な文字が含まれているというエラーが表示されます。

JSON.parse直後に試してみるとJSON.stringify、エラーは発生しません。

別のエンコーディングで保存するように何かを設定する必要がありますか? どうすれば修正できますか?

4

5 に答える 5

4

nsIPrefBranch.getCharPref()ただし、JSON データには ASCII 以外の文字が含まれています。設定に Unicode データを保存できますが、これは少し複雑です:

var str = Components.classes["@mozilla.org/supports-string;1"]
                    .createInstance(Components.interfaces.nsISupportsString);
str.data = value;
pref.setComplexValue(prefName, Components.interfaces.nsISupportsString, str);

そして、その設定を読むには:

var str = pref.getComplexValue(prefName, Components.interfaces.nsISupportsString);
var value = str.data;

参照用:ドキュメント

于 2012-04-17T11:17:07.783 に答える
1

この問題を修正するために、これを1か所で行いました。

(function overrideJsonParse() {
    if (!window.JSON || !window.JSON.parse) { 
        window.setTimeout(overrideJsonParse, 1); 
        return;  //this code has executed before JSON2.js, try again in a moment
    }
    var oldParse = window.JSON.parse;
    window.JSON.parse = function (s) {
        var b = "", i, l = s.length, c;
        for (i = 0; i < l; ++i) {
            c = s[i];
            if (c.charCodeAt(0) >= 32) { b += c; }
        }
        return oldParse(b);
    };
}());

これは、IE8(json2などを使用)、IE9、Firefox、およびChromeで機能します。

于 2012-10-12T19:18:19.237 に答える
1

JSON に などの非 ASCII 文字が含まれているよう½です。すべてがどのエンコーディングで処理されているか確認できますか?

nsIPrefBranch.setCharPref()は、入力が UTF-8 でエンコードされていることを前提としており、 の戻り値nsIPrefBranch.getCharPref()は常に UTF-8 文字列です。入力がバイト文字列または他のエンコーディングの文字である場合は、UTF-8 に切り替えるか、設定を操作するときに自分でエンコードおよびデコードする必要があります。

于 2012-04-08T19:44:50.620 に答える
0

それでも解決策を見つけることができませんでしたが、回避策を見つけました:

var b = "";
[].forEach.call("{ JSON STRING }", function(c, i) {
    if (c.charCodeAt(0) >= 32)
        b += c;
});

bこれが新しいJSONであり、機能する可能性があります...

于 2012-04-08T18:39:32.417 に答える
0

コードは正しいようです。二重引用符 "..":"..." の代わりに単一引用符 '..': '...' を使用してみてください。

于 2012-04-08T14:01:08.570 に答える