我想把下面的字符串转换成javascript中的数组。
{a:12, b:c, foo:bar}
如何将这个字符串转换成对象数组?有什么好主意吗?
ev7lccsx1#
我认为,作为Douglas Crockford(JavaScript的最大权威之一)suggests in here,最好的方法是使用JSON原生解析器,因为它不仅比eval()更快,而且更安全。本机JSON解析器已在以下版本中可用:
Crockford在javascript中做了一个安全的后备,称为json2.js,它是对eval()方法的修改,添加了一些安全位,并使用了本地JSON解析器API。您只需要包含该文件,删除它的第一行,并使用本地JSON解析器,如果它不存在,json2将完成这项工作。以下是一个示例:
var myJSONString = '{ "a": 1, "b": 2 }', myObject = JSON.parse(myJSONString);
解析后,您将得到一个具有属性a和b的对象,正如您可能知道的,您可以将对象视为JavaScript中的哈希表或associative array,因此您可以如下访问这些值:
a
b
myObject['a'];
如果您只需要一个简单的数组而不是一个关联数组,您可以执行如下操作:
var myArray = []; for(var i in myObject) { myArray.push(myObject[i]); }
最后,虽然在普通JavaScript中不需要,但JSON spec需要将成员的key用双引号引起来。因此,如果没有它,navite解析器将无法工作。如果我是你,我会添加它,但如果不可能,请使用var myObject = eval( "(" + myString + ")" );方法。
var myObject = eval( "(" + myString + ")" );
qojgxg4l2#
由于您的字符串是malformedJSON,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标记的属性中,并且不想转义引号。
hgc7kmma3#
最简单但不安全的方法是:
eval('(' + myJSONtext + ')')
但由于这会解释任何javascript代码,因此存在安全漏洞。为了防止这一点,请使用json解析器。如果您使用的是框架(jquery、mootools等),则会有一个特定于框架的调用。它们中的大多数都基于道格拉斯Crawford的解析器,可在http://www.json.org/js.html上找到。
tyu7yeag4#
您可以使用“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只有一级键值对。
noj0wjuj5#
解析就可以了,解析后就可以把它们推到数组中。
var object = JSON.parse(param); var array = []; for(var i in object) { array.push(object[i]); }
w6mmgewl6#
如果使用jQuery,则有$.parseJSON()函数。如果字符串格式不正确,则抛出异常,并且“此外,如果没有传入任何内容,则parseJSON将返回空字符串、null或未定义的'null'。如果浏览器提供了JSON.parse的本地实现,jQuery将使用它来解析字符串”
pengsaosao7#
使用安全求值。与JSON.parse不同,这不需要将键或值用引号括起来。只有当值包含嵌入式逗号时才用引号括起来。
const myStr = "{a:1, b:2, c:3}"; const myObj = string_exp(myStr); console.log("dot: " + myObj.c); function string_exp(sCmd) { return Function(`'use strict'; return (${sCmd})`)(); }
变量存在。-,替代方法,-最简单的方法
7条答案
按热度按时间ev7lccsx1#
我认为,作为Douglas Crockford(JavaScript的最大权威之一)suggests in here,最好的方法是使用JSON原生解析器,因为它不仅比eval()更快,而且更安全。
本机JSON解析器已在以下版本中可用:
Crockford在javascript中做了一个安全的后备,称为json2.js,它是对eval()方法的修改,添加了一些安全位,并使用了本地JSON解析器API。您只需要包含该文件,删除它的第一行,并使用本地JSON解析器,如果它不存在,json2将完成这项工作。
以下是一个示例:
解析后,您将得到一个具有属性
a
和b
的对象,正如您可能知道的,您可以将对象视为JavaScript中的哈希表或associative array,因此您可以如下访问这些值:如果您只需要一个简单的数组而不是一个关联数组,您可以执行如下操作:
最后,虽然在普通JavaScript中不需要,但JSON spec需要将成员的key用双引号引起来。因此,如果没有它,navite解析器将无法工作。如果我是你,我会添加它,但如果不可能,请使用
var myObject = eval( "(" + myString + ")" );
方法。qojgxg4l2#
由于您的字符串是malformedJSON,JSON解析器无法正确解析它,甚至eval()也会抛出错误。它也不是一个Array,而是一个HashMap或者只是一个Object文字(格式错误)。如果Object文字只包含数字和字符串值(没有子对象/数组),您可以使用以下代码。
该代码将把字符串转换为对象数组(复数)。
但是,如果您实际上需要的是HashMap(关联数组)而不是数组,请使用以下代码:
当你开始嵌套对象和数组时,上面的代码会变得更加复杂,基本上你必须重写JSON.js和JSON2.js来支持错误的JSON。
还可以考虑以下选项,我承认这仍然不好,但比将JSON粘贴在HTML标记的属性内稍微好一些。
我假设您省略了字符串中的引号,因为您已经将其放在HTML标记的属性中,并且不想转义引号。
hgc7kmma3#
最简单但不安全的方法是:
但由于这会解释任何javascript代码,因此存在安全漏洞。为了防止这一点,请使用json解析器。如果您使用的是框架(jquery、mootools等),则会有一个特定于框架的调用。它们中的大多数都基于道格拉斯Crawford的解析器,可在http://www.json.org/js.html上找到。
tyu7yeag4#
您可以使用“for in”
注意:考虑到myObject只有一级键值对。
noj0wjuj5#
解析就可以了,解析后就可以把它们推到数组中。
w6mmgewl6#
如果使用jQuery,则有$.parseJSON()函数。如果字符串格式不正确,则抛出异常,并且“此外,如果没有传入任何内容,则parseJSON将返回空字符串、null或未定义的'null'。如果浏览器提供了JSON.parse的本地实现,jQuery将使用它来解析字符串”
pengsaosao7#
使用安全求值。与JSON.parse不同,这不需要将键或值用引号括起来。只有当值包含嵌入式逗号时才用引号括起来。
变量存在。-,替代方法,-最简单的方法