我想将下面的字符串转换为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);

解析后,您将获得一个具有属性的对象 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,也不是一个字面的对象(畸形)。如果对象文字仅包含数字和字符串值(并且没有子对象/数组),则可以使用以下代码。

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标签的属性中,并且不想逃脱报价。

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

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]);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top