快捷搜索: 王者荣耀 脱发

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

根据上面的描述,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名加上双引号。

如果你不像手工添加,可以使用函数全文搜索追加双引号,比如下面的这段代码:

json_string.replace(/(s*?{s*?|s*?,s*?)(["])?([a-zA-Z0-9]+)(["])?:/g, $1"$3":);
eval(var json = new Object( + json_string + ));

最后,最简单的一种方法是直接用eval()运行它:

var obj = eval(( + invalid_json + ));

但这样执行时,你需要理解执行的代码是什么,因为如果它里面含有一些恶意程序,你这样直接运行很可能引起安全问题。

根据上面的描述,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名加上双引号。 如果你不像手工添加,可以使用函数全文搜索追加双引号,比如下面的这段代码: json_string.replace(/(s*?{s*?|s*?,s*?)(["])?([a-zA-Z0-9]+)(["])?:/g, $1"$3":); eval(var json = new Object( + json_string + )); 最后,最简单的一种方法是直接用eval()运行它: var obj = eval(( + invalid_json + )); 但这样执行时,你需要理解执行的代码是什么,因为如果它里面含有一些恶意程序,你这样直接运行很可能引起安全问题。
经验分享 程序员 微信小程序 职场和发展