3

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

所以删除了我帖子上的字符,所以看看真正的 JSON 的链接

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

问题是当我保存值时,Firefox 会做一些破坏 JSON 的事情。如果我尝试JSON.parse从配置中检索值,则会收到错误消息:

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

如果我尝试验证上面的 JSON(从设置中检索),我在 处收到错误line 20,令牌值包含两个无效字符。

如果我在错误没有发生JSON.parse后立即尝试。JSON.stringify

我是否必须设置一些东西才能以不同的编码保存?我该如何解决?

4

5 回答 5

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;

供参考:文档

于 2012-04-17T11:17:07.783 回答
1

您的 JSON 似乎包含非 ASCII 字符,例如½. 你能检查所有正在处理的编码是什么吗?

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

于 2012-04-08T19:44:50.620 回答
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 回答
0

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

于 2012-04-08T14:01:08.570 回答
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 回答