Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中将字符串转换为对象数组的最佳方法?_Javascript_Jquery_Arrays_Literals_String Literals - Fatal编程技术网

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

在javascript中将字符串转换为对象数组的最佳方法?,javascript,jquery,arrays,literals,string-literals,Javascript,Jquery,Arrays,Literals,String Literals,我想将下面的字符串转换为javascript中的数组 {a:12, b:c, foo:bar} 如何将此字符串转换为对象数组?有什么好主意吗?最简单但不安全的方法是: eval('(' + myJSONtext + ')') 但由于这将解释任何javascript代码,因此它存在安全漏洞。要防止这种情况,请使用json解析器。如果您使用的是框架(jquery、mootools等),那么会有一个特定于框架的调用。它们中的大多数都基于Douglas Crawford的解析器,可在上找到。您可以使

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

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

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

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

eval('(' + myJSONtext + ')')
但由于这将解释任何javascript代码,因此它存在安全漏洞。要防止这种情况,请使用json解析器。如果您使用的是框架(jquery、mootools等),那么会有一个特定于框架的调用。它们中的大多数都基于Douglas Crawford的解析器,可在上找到。

您可以使用“for in”


注意:考虑到myObject只有一个级别的键值对。

我认为最好的方法是使用,因为它不仅比eval()更快,而且更安全

本机JSON解析器已在以下位置可用:

  • 火狐3.5+
  • IE 8+
  • 歌剧10.5+
  • Safari Safari 4.0.3+
  • Chrome(不知道是哪个版本)
Crockford在javascript中做了一个安全的回退,名为,这是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中不是必需的,但是需要双引号引用成员的键。因此,如果没有它,navite解析器将无法工作。如果我是你,我会添加它,但如果不可能,则使用
var myObject=eval(“+myString+”)方法。

如果您使用的是jQuery,那么就有了这个函数。如果字符串格式不正确,则会引发异常,“此外,如果不传入任何内容,则parseJSON将返回空字符串、null或未定义的'null'。如果浏览器提供JSON.parse的本机实现,jQuery将使用它来解析字符串”

,因为您的字符串格式不正确,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

也考虑下面的选项,我承认这仍然是坏的,但是稍微好一些,然后将JSON插入HTML标签的属性中。

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

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

JSON.parse将完成此操作。解析后,可以将它们推入数组

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

这个数组看起来像什么?看起来很像JSON。这本身就很像一个关联数组,可以这样访问。你知道吗?[看这里](.它不是数组。它是单个字符串。我只是从tag属性中获取这个字符串。我想将这个字符串转换为数组。他们说的是,对象的功能非常类似于javascript中的数组,您提供的示例实际上会创建一个javascript对象,如果您将键/值括在单引号中并使用
 toJSON
。我假设你的意思是
{a:12,b:c',foo:bar}
…除非
c
bar
实际上是当前范围内的变量,而不是字符串。如果你真的想使用字符串,请将第一行更改为var myObject=eval('('+'{a:'12',b:'c',foo:'bar'}+'))var myObject=eval(“+myString+”)是什么意思?非常感谢。eval()将字符串解析为JavaScript源代码,并且由于所有有效的JSON也是有效的JavaScript(它来自JavaScript对象表示法),因此可以使用eval()将其转换为JavaScript表示形式。出于安全原因,通常会在字符串的开头和结尾添加父级,尽管使用eval()仍然非常不安全。因此,var myObject=eval(“(“+myString+”)”)只是解析myString JSON并在myObject变量中获取其值(可能是一个对象或数组)请注意,json2仍然使用eval,但会执行一些检查以缓解潜在的漏洞
var object = JSON.parse(param);
var array = [];
for(var i in object) {
   array.push(object[i]);
}