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

时间:2010-08-13 03:13:46

标签: javascript jquery arrays literals string-literals

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

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

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

6 个答案:

答案 0 :(得分:79)

我认为执行此操作的最佳方式是Douglas Crockford(JavaScript的一个重要大师)suggests in here正在使用JSON native parser,因为它不仅比json2.js更快eval(),它也更安全。

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

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

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

以下是一个例子:

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

解析后,您将获得一个包含属性ab的对象,您可能知道,您可以将对象视为哈希表或JavaScript中的JSON spec,所以你可以访问这样的值:

myObject['a'];

如果您只想要一个简单的数组而不是关联数组,那么您可以执行以下操作:

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

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

答案 1 :(得分:9)

由于您的字符串格式错误 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.jsJSON2.js以支持格式错误的JSON。

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

<div id="DATA001">bla</div>
<!-- namespacing your data is even better! -->
<script>var DATA001 = {a:12,b:"c",foo:"bar"};</script>

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

答案 2 :(得分:7)

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

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

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

答案 3 :(得分:2)

您可以使用“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只有一级键值对。

答案 4 :(得分:1)

如果你正在使用jQuery,那就是$.parseJSON()函数。如果字符串格式错误,它会抛出异常,并且“如果你什么也不传入,空字符串,null或未定义,那么将从parseJSON返回'null'。浏览器提供JSON.parse的本机实现,jQuery用它来解析字符串“

答案 5 :(得分:0)

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

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