我有以下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
,则不会发生错误。
我是否必须设置以不同编码保存的内容?我该如何解决?
答案 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,可能有用......