Лучший способ конвертировать строку в массив объекта в javascript?
Я хочу преобразовать строку ниже в массив в javascript.
{a:12, b:c, foo:bar}
Как мне преобразовать эту строку в массив объектов? Есть классная идея?
6 ответов
Я думаю, что лучший способ сделать это, как Дуглас Крокфорд (один из самых больших гуру JavaScript) предполагает здесь С помощью JSON native parser, поскольку он не только быстрее, чем eval (), он также более безопасен.
собственный парсер JSON уже доступен в:
- Firefox 3.5+
- IE 8+
- Опера 10.5+
- Сафари Сафари 4.0.3+
- Chrome (не знаю, какая версия)
и Крокфорд сделал безопасный резервный вариант в javascript, называемый json2.js, который является адаптацией подхода eval (), с добавлением некоторых битов безопасности и с собственным API синтаксических анализаторов JSON. Вам просто нужно включить этот файл, удалить его первую строку и использовать собственный парсер 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 spec требует двойного цитирования ключа член. Таким образом, анализатор 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 и т. д. есть конкретный звонок. Большинство из них основаны на парсер Дуглас Кроуфорд доступны в http://www.json.org/js.html.
вы можете использовать "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 имеет только один уровень пар ключ-значение.
в формате JSON.разбор сделает свое дело. После анализа вы можете поместить их в массив.
var object = JSON.parse(param);
var array = [];
for(var i in object) {
array.push(object[i]);
}