2012-04-08 19 views
3

を破壊していますFirefoxの設定(pref.setCharPref(prefName, value);Firefoxの県は、私は、次のJSONを持っているJSON

問題は、私が値を保存すると、FirefoxがJSONを破壊するようなことが起こることです。私は設定から​​値を取得JSON.parseをしようとすると、私はエラーを取得する:

私は、トークンの値は、2つの無効な文字が含まれている、 line 20でエラーが発生します(設定から取得された)
Error: JSON.parse: bad control character in string literal 

If I try to validate the above JSON

JSON.stringifyの直後にJSON.parseを試してもエラーは発生しません。

別のエンコードで保存するように設定する必要はありますか?どうすれば修正できますか?

+1

保存された設定は実際にどのように見えますか?あなたの質問にあるJSONは有効です。 – Collin

+0

@Collin私はSOが文字を削除したと思います... 'Tokens'には2つの見えない文字があります:http://pastebin.com/Sh20StJY – BrunoLM

答えて

4

nsIPrefBranch.getCharPref()はASCIIデータの場合にのみ機能しますが、JSONデータには非ASCII文字がいくつか含まれています。

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

そして、その好みを読むために:あなたは、それは単に少し複雑です、環境設定でUnicodeデータを格納することができ

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

参考のために:Documentation

+0

これはすごく素晴らしいです!私の日を救った。 UTF-8でエンコードされた文字列が¥uxxxxから間違った文字に変換され、文字列化された文字列を読み込むときに 'JSON.parse'が失敗するという問題があります。 ;)+1! –

0

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

0

私はまだ解決策を見つけることができませんでしたが、私は回避策が見つかりました:今

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

bは新しいJSONで、うまくいくかもしれない...

1

をあなたのJSONは、非含まれて表示されますなどのASCII文字。すべてのエンコーディングがどのエンコーディングで処理されているか確認できますか?

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

+0

非常に近いですがシガーはありません:)私の答えを見てください。 –

+0

@WladimirPalantああ、私はドキュメントを間違って解釈したと思います。ありがとう! – ephemient

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で動作しますg json2など)、IE9、Firefox、Chromeなどがあります。

関連する問題