我想将下面的字符串转换为javascript中的数组。
{a:12, b:c, foo:bar}
如何将此字符串转换为对象数组?有什么好主意吗?
答案 0 :(得分:79)
我认为执行此操作的最佳方式是Douglas Crockford(JavaScript的一个重要大师)suggests in here正在使用JSON native parser,因为它不仅比json2.js更快eval(),它也更安全。
Native JSON解析器已在以下位置提供:
Crockford在javascript中做了一个安全的回退,名为associative array,这是eval()方法的改编,添加了一些安全位,并使用原生JSON解析器API。您只需要包含该文件,删除其第一行,并使用本机JSON解析器,如果它不存在,json2将完成工作。
以下是一个例子:
var myJSONString = '{ "a": 1, "b": 2 }',
myObject = JSON.parse(myJSONString);
解析后,您将获得一个包含属性a
和b
的对象,您可能知道,您可以将对象视为哈希表或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.js和JSON2.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]);
}