Я хочу преобразовать ниже строки в массив в JavaScript.
{a:12, b:c, foo:bar}
Как я преобразовываю эту строку в массив объектов? Какая-либо классная идея?
Я думаю, что лучший способ сделать это, как предлагает Дуглас Крокфорд (один из крупнейших гуру JavaScript) здесь, использовать родной синтаксический анализатор JSON, поскольку он не только быстрее, чем eval(), но и более безопасен.
Собственный парсер JSON уже доступен в:
И Крокфорд сделал безопасный запасной вариант в 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 требует двойных кавычек для ключей членов. Так что парсер навите без него работать не будет. На вашем месте я бы добавил его, но если это невозможно, используйте подход var myObject = eval("(" + myString + ")");
.
Поскольку ваша строка имеет неправильный формат JSON, анализатор JSON не может ее правильно проанализировать, и даже eval () выдаст ошибку. Это также не массив, а HashMap или просто литерал объекта (неправильный). Если литерал 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-тега и не хотите экранировать кавычки.
Вы можете использовать «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 имеет только один уровень пар ключ-значение.
Самый простой, но небезопасный способ сделать это:
eval('(' + myJSONtext + ')')
Но поскольку он интерпретирует любой код javascript, в нем есть дыры в безопасности. Для защиты от этого используйте парсер json. Если вы используете фреймворк (jquery, mootools и т. Д.), Существует специальный вызов фреймворка. Большинство из них основано на синтаксическом анализаторе Дугласа Кроуфорда, доступном по адресу http://www.json.org/js.html .