在javascript中将字符串转换为对象数组的最佳方法?

我想在javascript中将下面的字符串转换为数组。

{a:12, b:c, foo:bar} 

如何将此字符串转换为对象数组? 有什么好主意吗?

我认为最好的方法就像道格拉斯克罗克福德(JavaScript的一个重要大师) 所说的那样使用JSON本机解析器 ,因为它不仅比eval()更快,而且更安全。

原生JSON解析器已在以下位置提供:

  • Firefox 3.5+
  • IE 8+
  • Opera 10.5+
  • Safari Safari 4.0.3+
  • Chrome(不知道哪个版本)

而且Crockford在javascript中做了一个安全的回退,称为json2.js ,它是eval()方法的一种改编,添加了一些安全位和原生JSON解析器API。 您只需要包含该文件,删除其第一行,并使用本机JSON解析器,如果它不存在,json2将完成工作。

这是一个例子:

 var myJSONString = '{ "a": 1, "b": 2 }', myObject = JSON.parse(myJSONString); 

解析后,您将获得一个带有属性ab的对象,您可能知道,您可以将对象视为JavaScript中的哈希表或关联数组 ,因此您可以像这样访问这些值:

 myObject['a']; 

如果你只想要一个简单的数组而不是一个关联的数组,你可以做类似的事情:

 var myArray = []; for(var i in myObject) { myArray.push(myObject[i]); } 

最后,虽然在纯JavaScript中没有必要,但JSON规范要求双引用成员的密钥。 因此,没有它,navite解析器将无法工作。 如果我是你,我会添加它,但如果不可能使用var myObject = eval( "(" + myString + ")" ); 做法。

由于您的字符串格式错误, JSON,JSON解析器无法正确解析它,甚至eval()也会抛出错误。 它也不是一个数组,而是一个HashMap,或者只是一个Object文字(格式不正确)。 如果Object文字只包含数字和字符串值(并且没有子对象/数组),则可以使用以下代码。

 function malformedJSON2Array (tar) { var arr = []; tar = tar.replace(/^\{|\}$/g,'').split(','); for(var i=0,cur,pair;cur=tar[i];i++){ arr[i] = {}; pair = cur.split(':'); arr[i][pair[0]] = /^\d*$/.test(pair[1]) ? +pair[1] : pair[1]; } return arr; } malformedJSON2Array("{a:12, b:c, foo:bar}"); // result -> [{a:12},{b:'c'},{foo:'bar'}] 

该代码将您的字符串转换为对象数组(复数)。

但是,如果您确实需要HashMap(关联数组)而不是数组,请使用以下代码:

 function malformedJSON2Object(tar) { var obj = {}; tar = tar.replace(/^\{|\}$/g,'').split(','); for(var i=0,cur,pair;cur=tar[i];i++){ pair = cur.split(':'); obj[pair[0]] = /^\d*$/.test(pair[1]) ? +pair[1] : pair[1]; } return obj; } malformedJSON2Object("{a:12, b:c, foo:bar}"); // result -> {a:12,b:'c',foo:'bar'} 

当您开始嵌套对象和数组时,上面的代码将变得更加复杂。 基本上你必须重写JSON.js和JSON2.js以支持格式错误的JSON。

还要考虑以下选项,我承认这仍然很糟糕,但稍微好于将JSON粘贴到HTML标记的属性中。

 
bla

我假设您在字符串中省略引号,因为您已将其放在HTML标记的属性中,并且不想转义引号。

最简单但不安全的方法是:

 eval('(' + myJSONtext + ')') 

但由于这将解释任何JavaScript代码,它有安全漏洞。 为了防止这种情况,请使用json解析器。 如果你正在使用一个框架(jquery,mootools等),那就是一个特定于框架的调用。 其中大多数是基于Douglas Crawford的解析器,可从http://www.json.org/js.html获得 。

你可以使用“for in”

 var myObject = {a:'12', b:'c', foo:'bar'}; var myArray = []; for(key in myObject) { var value = myObject[key]; myArray[key] = value; } myArray['a']; // returns 12 

注意:考虑到myObject只有一级键值对。

如果你使用的是jQuery,那就是$ .parseJSON()函数。 如果字符串格式错误,它会抛出exception,并且“如果你没有传入任何内容,空字符串,null或未定义,则会从parseJSON返回’null’。浏览器提供JSON.parse的本机实现,jQuery用它来解析字符串“

JSON.parse会做到这一点。 解析后,您可以将它们推入arrays。

 var object = JSON.parse(param); var array = []; for(var i in object) { array.push(object[i]); }