我遇到了问题,因为我升级了我的prototypeJS框架。
JSON解析不再能将此字符串转换为对象。
"{empty: false, ip: true}"
以前在版本1.6中它是可能的,现在它需要是一个“验证”的JSON字符串,如
'{"empty": false, "ip": true}'
但是我如何将第一个例子转换回一个对象?
答案 0 :(得分:7)
JSON需要引用所有键,所以:
"{empty: false, ip: true}"
不是有效的JSON。您需要对其进行预处理才能解析此JSON。
function preprocessJSON(str) {
return str.replace(/("(\\.|[^"])*"|'(\\.|[^'])*')|(\w+)\s*:/g,
function(all, string, strDouble, strSingle, jsonLabel) {
if (jsonLabel) {
return '"' + jsonLabel + '": ';
}
return all;
});
}
(Try on JSFiddle)它使用一个简单的正则表达式替换一个单词,后跟冒号,在双引号内引用该单词。正则表达式不会引用其他字符串中的标签。
然后你可以安全地
data = JSON.parse(preprocessJSON(json));
答案 1 :(得分:1)
有意义的是,json解析器不接受第一个输入,因为它是无效的json。您在第一个示例中使用的是javascript对象表示法。可以使用eval()
函数将其转换为对象。
var str = "({empty: false, ip: true})";
var obj = eval(str);
当然,如果您有保证您将要执行的代码是保存,那么您当然应该这样做。 您可以找到有关json规范here的更多信息。可以找到json验证器here。
编辑:上面的泰语答案可能是更好的解决方案
答案 2 :(得分:0)
const dataWithQuotes = str.replace(/("(\\.|[^"])*"|'(\\.|[^'])*')|(\w+)\s*:/g, (all, string, strDouble, strSingle, jsonLabel) => {
if (jsonLabel) {
return `"${jsonLabel}": `;
}
return all;
});
return dataWithQuotes
与上述类似的解决方案,但使用箭头功能进行了更新。