将字符串转换为JavaScript中对象数组的最佳方法?
-
28-09-2019 - |
题
我想将下面的字符串转换为JavaScript中的数组。
{a:12, b:c, foo:bar}
如何将此字符串转换为对象数组?有什么好主意吗?
解决方案
我认为这样做的最好的方法是 道格拉斯·克罗克福德(Douglas Crockford) (JavaScript的最大专家之一) 在这里建议 正在使用 JSON本地解析器, ,因为它不仅比Eval()快,而且更安全。
本地JSON PARSER已有以下内容:
- Firefox 3.5+
- 即8+
- 歌剧10.5+
- Safari Safari 4.0.3+
- Chrome(不知道哪个版本)
克罗克福德(Crockford)在JavaScript中获得了安全的后卫 json2.js, ,这是eval()方法的改编,并添加了一些安全位,并带有本机JSON Parsers 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()也会丢失错误。它也不是数组,而是一个hashmap,也不是一个字面的对象(畸形)。如果对象文字仅包含数字和字符串值(并且没有子对象/数组),则可以使用以下代码。
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.
您可以使用“ 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() 功能。如果字符串畸形,它会引发异常,并且“如果您一无所获,则将一个空字符串,null或Undewined,'null'将从Parsejson返回。浏览器提供JSON.PARSE的本机实现,JQUERY,JQUERY用它来解析字符串”
JSON.PARSE将做到这一点。解析后,您可以将它们推入数组。
var object = JSON.parse(param);
var array = [];
for(var i in object) {
array.push(object[i]);
}