将“转换”的对象字符串转换为JSON或Object

时间:2011-01-24 11:05:13

标签: javascript json prototypejs

我遇到了问题,因为我升级了我的prototypeJS框架。

JSON解析不再能将此字符串转换为对象。

"{empty: false, ip: true}"

以前在版本1.6中它是可能的,现在它需要是一个“验证”的JSON字符串,如

'{"empty": false, "ip": true}'

但是我如何将第一个例子转换回一个对象?

3 个答案:

答案 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

与上述类似的解决方案,但使用箭头功能进行了更新。