Zec*_*eck 28 javascript arrays jquery literals string-literals
我想在javascript中将下面的字符串转换为数组.
{a:12, b:c, foo:bar}
Run Code Online (Sandbox Code Playgroud)
如何将此字符串转换为对象数组?有什么好主意吗?
alc*_*ado 78
我认为这样做的最好方法,就像道格拉斯·克罗克福德(JavaScript的一个重要大师)所说,这里使用的是JSON本地解析器,因为它不仅比eval()更快,而且更安全.
原生JSON解析器已在以下位置提供:
And Crockford has made a safe fallback in javascript, called json2.js, which is an adaption of the eval() approach, with some security bits added and with the native JSON parsers API. You just need to include that file, remove its first line, and use the native JSON parser, and if it's not present json2 would do the work.
Here is an example:
var myJSONString = '{ "a": 1, "b": 2 }',
myObject = JSON.parse(myJSONString);
Run Code Online (Sandbox Code Playgroud)
Once parsed you'll get an object with attributes a and b, and as you may know, you can treat an object as a hash table or associative array in JavaScript, so you would be able to access the values like this:
myObject['a'];
Run Code Online (Sandbox Code Playgroud)
If you just want a simple array and not an associative one you could do something like:
var myArray = [];
for(var i in myObject) {
myArray.push(myObject[i]);
}
Run Code Online (Sandbox Code Playgroud)
最后,虽然在纯JavaScript中没有必要,但JSON规范要求双引用成员的密钥.因此,没有它,navite解析器将无法工作.如果我是你,我会添加它,但如果不可能使用该var myObject = eval( "(" + myString + ")" );方法.
由于您的字符串是格式错误的 JSON,因此JSON解析器无法正确解析它,甚至eval()也会抛出错误.它也不是一个数组,而是一个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'}]
Run Code Online (Sandbox Code Playgroud)
该代码将您的字符串转换为对象数组(复数).
但是,如果您确实需要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'}
Run Code Online (Sandbox Code Playgroud)
当您开始嵌套对象和数组时,上面的代码将变得更加复杂.基本上你必须重写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>
Run Code Online (Sandbox Code Playgroud)
我假设您在字符串中省略引号,因为您已将其放在HTML标记的属性中,并且不想转义引号.
最简单但不安全的方法是:
eval('(' + myJSONtext + ')')
Run Code Online (Sandbox Code Playgroud)
但由于这将解释任何JavaScript代码,它有安全漏洞.为了防止这种情况,请使用json解析器.如果你正在使用一个框架(jquery,mootools等),那就是一个特定于框架的调用.其中大多数是基于Douglas Crawford的解析器,可从http://www.json.org/js.html获得.
| 归档时间: |
|
| 查看次数: |
83350 次 |
| 最近记录: |