我想将下面的字符串转换为javascript中的数组。
{a:12, b:c, foo:bar}
如何将此字符串转换为对象数组?有什么好主意吗?
我想将下面的字符串转换为javascript中的数组。
{a:12, b:c, foo:bar}
如何将此字符串转换为对象数组?有什么好主意吗?
我认为最好的方法是使用JSON 本机解析器,正如Douglas Crockford(JavaScript 最伟大的大师之一)在这里所建议的那样,因为它不仅比 eval() 更快,而且更安全。
本机 JSON 解析器已在以下版本中可用:
Crockford 在 javascript 中做了一个安全的后备,称为json2.js,它是对 eval() 方法的改编,添加了一些安全位并使用本机 JSON 解析器 API。您只需要包含该文件,删除它的第一行,并使用本机 JSON 解析器,如果它不存在,json2 就可以完成这项工作。
这是一个例子:
var myJSONString = '{ "a": 1, "b": 2 }',
myObject = JSON.parse(myJSONString);
解析后,您将获得一个具有属性a
和的对象b
,并且您可能知道,您可以将对象视为 JavaScript 中的哈希表或关联数组,因此您可以像这样访问这些值:
myObject['a'];
如果您只想要一个简单的数组而不是关联数组,您可以执行以下操作:
var myArray = [];
for(var i in myObject) {
myArray.push(myObject[i]);
}
最后,虽然在纯 JavaScript 中不是必需的,但JSON 规范需要双引号成员的键。所以没有它,navite 解析器将无法工作。如果我是你,我会添加它,但如果不可能使用该var myObject = eval( "(" + myString + ")" );
方法。
由于您的字符串是格式错误的 JSON,因此 JSON 解析器无法正确解析它,甚至 eval() 都会抛出错误。它也不是一个 Array 而是一个 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 标记的属性中并且不想转义引号。
最简单但不安全的方法是:
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 只有一层键值对。
JSON.parse 可以解决问题。解析后,您可以将它们推送到数组中。
var object = JSON.parse(param);
var array = [];
for(var i in object) {
array.push(object[i]);
}
如果您使用的是 jQuery,则有$.parseJSON()函数。如果字符串格式错误,它会抛出异常,并且“另外,如果你什么都不传递,一个空字符串、null 或未定义,'null' 将从 parseJSON 返回。浏览器提供 JSON.parse 的本机实现,jQuery用它来解析字符串”