您的位置:首页 > Web前端 > JavaScript

JavaScript:将key名不带双引号的JSON字符串转换成JSON对象的方法

2016-10-05 18:49 771 查看
根据json.org上面的描述,JSON对象是由对象成员组成,而成员是由key-value键值组成。key值是一个字符串:

字符串由Unicode字符组成,用双引号包围,用反斜杠转义。可以是单个字符。用法跟C或Java里的字符串的用法相似。

但是,在现实应用中,很少有程序员知道JSON里的key需要用双引号包围,因为大多数的浏览器里并不需要使用双引号。所以,为什么多此一举要多写两个双引号呢?
规范的例子:
{
"keyName" : 34
}

不规范的例子:
{
keyName : 34
}

虽然在浏览器里使用不规范的、不使用双引号的写法在浏览器里不会出现问题,但并不代表你可以在其它地方不会遇到问题,比如,你有一个字符串:
//字符串格式
'{   keyName : 34 }'

你想把它转换成JSON对象。把JSON字符串转换成JSON对象,需要使用
JSON.parse()
方法,对于上面的这种key名上不带双引号的的JSON字符串,使用
JSON.parse()
解析时会报错,无法解析。这就成了一个很麻烦的问题。所以说,尽量使用规范的预防还是有好处的,尽管大多数时候你不会遇到问题。
那么,对于key名不带双引号的JSON字符串,如何将它转换成JSON对象呢?
最直接的方法是手工给key名加上双引号。
如果你不像手工添加,可以使用函数全文搜索追加双引号,比如下面的这段代码:
var json_string = "{ keyName : 34, 'keyCode' : '5554'}";
console.log(json_string);//{ keyName : 34, 'keyCode' : '5554'}
console.log(/(?:\s*['"]*)?([a-zA-Z0-9]+)(?:['"]*\s*)?:/g.test(json_string))//true
console.log(json_string.match(/(?:\s*['"]*)?([a-zA-Z0-9]+)(?:['"]*\s*)?:/g));//[" keyName :", " 'keyCode' :"]
json_string = json_string.replace(/(?:\s*['"]*)?([a-zA-Z0-9]+)(?:['"]*\s*)?:/g, "'$1':");
console.log(json_string);//{'keyName': 34,'keyCode': '5554'}
var json = eval('('+ json_string + ')');
console.log(json);//Object {keyName: 34, keyCode: "5554"}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐