2011-01-24 99 views
0

我遇到以下问题,因为我升级了我的prototypeJS框架。将“已转换”的对象字符串转换为JSON或对象

JSON解析无法将此字符串转换为对象。

"{empty: false, ip: true}" 

以前在1.6版本有可能,现在它必须是一个“有效的” JSON字符串像

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

但我怎么能转换成第一例回一个对象?

回答

6

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

它是有道理的,json解析器不接受第一个输入,因为它是无效的json。你在第一个例子中使用的是javascript对象表示法。可以使用eval()函数将其转换为对象。

var str = "({empty: false, ip: true})"; 
var obj = eval(str); 

当然你只应该这样做,如果你有保证你将执行的代码是保存。 你可以找到更多关于JSON规格here的信息。一个json验证器可以被发现here

编辑:以上泰国的回答可能是一个更好的解决方案

+2

您需要的顺序添加括号的JavaScript引擎看到它作为一个对象,而不是块。 `eval('('+ str +')')`。 – Thai 2011-01-24 11:38:27

+0

谢谢,这对我的作品:) – Maertz 2011-01-24 12:28:19