Firefox pref正在销毁JSON

时间:2012-04-08 12:55:05

标签: javascript json firefox-addon

我有以下JSON:http://pastebin.com/Sh20StJY

SO删除了帖子中的字符,所以请查看真实JSON的链接

使用JSON.stringify生成并保存在Firefox prefs(pref.setCharPref(prefName, value);

问题在于,当我保存值时,Firefox会破坏JSON。如果我尝试JSON.parse从配置中检索值,我会收到错误:

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

If I try to validate the above JSON(从设置中检索到)我在line 20收到错误,令牌值包含两个无效字符。

如果我在JSON.parse之后立即尝试JSON.stringify,则不会发生错误。

我是否必须设置以不同编码保存的内容?我该如何解决?

5 个答案:

答案 0 :(得分:4)

nsIPrefBranch.getCharPref()仅适用于ASCII数据,但您的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;

供参考:Documentation

答案 1 :(得分:1)

您的JSON似乎包含非ASCII字符,例如½。你能检查出处理所有内容的编码吗?

nsIPrefBranch.setCharPref()假设其输入为UTF-8编码,nsIPrefBranch.getCharPref()的返回值始终为UTF-8字符串。如果您的输入是字节字符串或其他编码中的字符,您将需要切换到UTF-8,或者在与首选项交互时自行编码和解码。

答案 2 :(得分: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。

答案 3 :(得分:0)

代码似乎是正确的。尝试使用单引号'..':'...'而不是双引号“..”:“...”。

答案 4 :(得分:0)

我仍然找不到解决方案,但我找到了解决方法:

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

现在b是新的JSON,可能有用......