Лучший способ преобразовать строку в массив объекта в JavaScript? - PullRequest
28 голосов
/ 13 августа 2010

Я хочу преобразовать строку ниже в массив в JavaScript.

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

Как мне преобразовать эту строку в массив объектов? Любая крутая идея?

Ответы [ 6 ]

78 голосов
/ 27 августа 2010

Я думаю, что лучший способ сделать это, как Дуглас Крокфорд (один из самых больших гуру JavaScript) предлагает здесь использовать собственный JSON-анализатор , поскольку он не только быстрее, чем eval (), но и более безопасен.

Собственный анализатор JSON уже доступен в:

  • Firefox 3.5 +
  • IE 8 +
  • Opera 10.5 +
  • Safari Safari 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 требует двойных кавычек ключей членов.Так что анализатор navite не будет работать без него.На вашем месте я бы добавил это, но если это невозможно, используйте подход var myObject = eval( "(" + myString + ")" );.

9 голосов
/ 01 сентября 2010

Поскольку ваша строка искажена 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-тега и не хотите экранировать кавычки.

7 голосов
/ 13 августа 2010

Самый простой, но небезопасный способ сделать это:

eval('(' + myJSONtext + ')')

Но поскольку это будет интерпретировать любой код JavaScript, у него есть дыры в безопасности.Для защиты от этого используйте парсер json.Если вы используете фреймворк (jquery, mootools и т. Д.), Есть вызов, специфичный для фреймворка.Большинство из них основаны на парсере Дугласа Кроуфорда, доступном по адресу http://www.json.org/js.html.

2 голосов
/ 13 августа 2010

Вы можете использовать «для в»

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 имеет только один уровень пар ключ-значение.

1 голос
/ 01 сентября 2010

Если вы используете jQuery, есть функция $. ParseJSON () .Он генерирует исключение, если строка искажена, и «Кроме того, если вы передаете ничего, пустая строка, null или undefined, из parseJSON будет возвращено« null ». Где браузер предоставляет собственную реализацию JSON.parse, jQueryиспользует его для разбора строки "

0 голосов
/ 09 марта 2018

JSON.parse поможет. После анализа вы можете вставить их в массив.

var object = JSON.parse(param);
var array = [];
for(var i in object) {
   array.push(object[i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...