Разобрать JSON в JavaScript? [Дубликат]

1518

Я хочу разбирать строку JSON в JavaScript. Ответ - это что-то вроде

var response = '{"result":true,"count":1}';

Как я могу получить значения result и count из этого?

  • 1
    var json = '{"result": true, "count": 1}', obj = JSON.parse (json); console.log (obj.count); // если использовать в nodejs, тогда использовать консоль
Теги:
parsing

16 ответов

1961
Лучший ответ

Большинство браузеров поддерживают JSON.parse(), который определен в ECMA-262 5th Edition (спецификация, на которой основан JavaScript). Его использование прост:

var json = '{"result":true,"count":1}',
    obj = JSON.parse(json);

alert(obj.count);

Для браузеров, которые вы не можете реализовать, используя json2.js.

Как отмечено в комментариях, если вы уже используете jQuery, есть функция $.parseJSON, которая отображается в JSON.parse, если она доступна, или форма eval в старых браузерах. Тем не менее, это выполняет дополнительные, ненужные проверки, которые также выполняются с помощью JSON.parse, поэтому для наилучшей всесторонней производительности я бы рекомендовал использовать его так:

var json = '{"result":true,"count":1}',
    obj = JSON && JSON.parse(json) || $.parseJSON(json);

Это гарантирует, что вы сразу же используете native JSON.parse, вместо того, чтобы jQuery выполнял проверки здравомыслия в строке перед передачей его на нативную функцию синтаксического анализа.

  • 0
    я думаю, что JSON.parse не работает в IE ??
  • 33
    @Marwan: IE 8+ поддерживает JSON.parse() . Для IE 6, 7 и других старых браузеров вы можете использовать json2.js, на который я ссылался из моего поста. В качестве альтернативы, но менее безопасно, вы можете использовать eval .
Показать ещё 11 комментариев
95

Прежде всего, вы должны убедиться, что код JSON действителен.

После этого я бы рекомендовал использовать библиотеку JavaScript, такую ​​как jQuery или Prototype, если это возможно, потому что эти вещи хорошо обрабатываются в этих библиотеках.

С другой стороны, если вы не хотите использовать библиотеку, и вы можете поручиться за действительность объекта JSON, я бы просто обернул строку анонимной функцией и использовал функцию eval.

Это не рекомендуется, если вы получаете объект JSON из другого источника, который не является абсолютно надежным, потому что функция eval позволяет использовать ренегатный код, если вы это сделаете.

Вот пример использования функции eval:

var strJSON = '{"result":true,"count":1}';
var objJSON = eval("(function(){return " + strJSON + ";})()");
alert(objJSON.result);
alert(objJSON.count);

Если вы контролируете, какой браузер используется, или вас не беспокоят люди со старым браузером, вы всегда можете использовать метод JSON.parse.

Это действительно идеальное решение для будущего.

  • 0
    Хороший человек! Я не смог импортировать библиотеку JSON, потому что она конфликтовала с другими библиотеками
  • 22
    eval () в порядке, чтобы выполнить задание, хотя он может компилировать и выполнять любую программу Javascript, поэтому могут возникнуть проблемы с безопасностью . Я думаю, что JSON.parse () - лучший выбор.
Показать ещё 3 комментария
49

Если вы получаете это с внешнего сайта, может быть полезно использовать jQuery getJSON. Если это список, вы можете перебирать его с помощью $.each

$.getJSON(url, function (json) {
    alert(json.result);
    $.each(json.list, function (i, fb) {
        alert(fb.result);
    });
});
33

Если вы хотите использовать JSON 3 для старых браузеров, вы можете загрузить его условно:

<script>
    window.JSON || 
    document.write('<script src="/json3.min.js"><\/scr'+'ipt>');
</script>

Теперь стандартный объект window.JSON доступен вам независимо от того, в каком браузере работает клиент.

  • 1
    Он доступен вам после завершения загрузки json3.min.js . Это не дает вам обратный вызов, когда он доступен. Таким образом, ваш код может работать сегодня, но не будет работать в среду, когда cdnjs.cloudflare.com неожиданно работает медленнее, чем обычно, или сеть загружена или по одной из 10000 других причин. Требуй JS вместо.
  • 5
    Питер, это не правильно. Как загрузка внешних сценариев, так и document.write являются синхронными действиями, поэтому все сценарии, размещенные после, будут ожидать загрузки до того, как будут выполнены. Для загрузки только JSON3 это хороший подход. RequireJS пригодился бы, если бы ваш проект становился все более сложным и должен был загружать сценарии со сложными отношениями зависимостей. Просто помните, что document.write заблокирует рендеринг страницы, поэтому поместите его внизу вашей разметки.
Показать ещё 2 комментария
30

В следующем примере будет ясно:

var jsontext   = '{"name":"x","age":"11"}';
var getContact = JSON.parse(jsontext);
document.write(getContact.name + ", " + getContact.age);

// Output: x, 11

ИЛИ

Вы также можете использовать функцию eval. В следующем примере используется функция eval:

var jsontext   = '{"name":"x","age":"11"}';
var getContact = eval('(' + jsontext + ')');
document.write(getContact.name + ", " + getContact.age);

// Output: x, 11

Так как функция JSON.parse более безопасна и выполняется быстрее, чем функция eval, я рекомендую использовать функцию JSON.parse.

  • 0
    использование eval() ОПАСНО
26

Вы можете использовать функцию eval, как в некоторых других ответах. (Не забудьте дополнительные скобки.) Вы узнаете, почему, когда вы копаете глубже) или просто используйте функцию jQuery parseJSON:

var response = '{"result":true , "count":1}'; 
var parsedJSON = $.parseJSON(response);

ИЛИ

Вы можете использовать этот ниже код.

var response = '{"result":true , "count":1}';
var jsonObject = JSON.parse(response);

И вы можете получить доступ к полям с помощью jsonObject.result и jsonObject.count.

  • 0
    jsonObject.count в console.log возвращает неопределенное значение. Как мне это назвать?
25

Если вы передаете строчную переменную (хорошо сформированную строку JSON) в JSON.parse из MVC @Viewbag, которая имеет двойную кавычку, '' ', в качестве кавычек, вам нужно обработать ее перед JSON.parse(jsonstring)

    var jsonstring = '@ViewBag.jsonstring';
    jsonstring = jsonstring.replace(/&quot;/g, '"');  
  • 0
    Что ты имеешь в виду под этим? Почему вы отправляете ответ на древний вопрос?
  • 6
    То, что они сказали в предыдущих ответах, не помогает в случае, если значение параметра содержит двойные кавычки в строке. Это должно быть заменено глобально реальной двойной кавычкой !! Я с трудом узнаю, чтобы поделиться, если у кого-то есть такая же проблема
Показать ещё 1 комментарий
24

Самый простой способ с использованием метода parse():

var response = '{"a":true,"b":1}';
var JsonObject= JSON.parse(response);

это пример того, как получить значения:

var myResponseResult = JsonObject.a;
var myResponseCount = JsonObject.b;
19

JSON.parse() преобразует любую строку JSON, переданную в функцию, в объект JSON.

Для лучшего понимания нажмите F12, чтобы открыть элемент "Проверка" вашего браузера, и перейдите на консоль, чтобы написать следующие команды:

var response = '{"result":true,"count":1}'; // Sample JSON object (string form)
JSON.parse(response); // Converts passed string to a JSON object.

Теперь запустите команду:

console.log(JSON.parse(response));

Вы получите результат как Object {result: true, count: 1}.

Чтобы использовать этот объект, вы можете назначить его переменной, скажем obj:

var obj = JSON.parse(response);

Теперь, используя obj и оператор точки (.), вы можете получить доступ к свойствам объекта JSON.

Попробуйте выполнить команду

console.log(obj.result);
19

Без использования библиотеки вы можете использовать eval - единственный раз, когда вы должны использовать. Однако безопаснее использовать библиотеку.

например,...

var response = '{"result":true , "count":1}';

var parsedJSON = eval('('+response+')');

var result=parsedJSON.result;
var count=parsedJSON.count;

alert('result:'+result+' count:'+count);
  • 0
    eval не может обработать строку json, которая возвращается как HTML
  • 12
    Если он в кодировке HTML, это больше не JSON.
Показать ещё 1 комментарий
17

Если вам нравится

var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);

вы можете получить доступ к элементам JSON JsonObject с помощью (.) точки:

JsonObject.result;
JsonObject.count;
11

Я думал, что JSON.parse(myObject) будет работать. Но в зависимости от браузеров, возможно, стоит использовать eval('('+myObject+')'). Единственная проблема, которую я могу порекомендовать, - это многоуровневый список в JSON.

  • 2
    eval () может также скомпилировать и выполнить любой javascript. так что вы можете столкнуться с потенциальной проблемой безопасности, если используете eval (). но анализатор json распознает только строки json и компилирует их в объекты javascript.
9

Простой способ сделать это:

var data = '{"result":true,"count":1}';
var json = eval("[" +data+ "]")[0]; // ;)
4

Если вы используете Dojo Toolkit:

require(["dojo/json"], function(JSON){
    JSON.parse('{"hello":"world"}', true);
});
  • 0
    var j = '[{"name": "John", "age": 30, "city": "New York"}, {"name": "George", "age": 48, "city": " Кутаиси "}] '; var obj = JSON.parse (j); оповещения (obj.length); for (var i = 0; i <obj.length; i ++) {alert (obj [i] .city + '' + obj [i] .age); }
4

Как упоминалось многими другими, большинство браузеров поддерживают JSON.parse и JSON.stringify.

Теперь я также хотел бы добавить, что если вы используете AngularJS (что я настоятельно рекомендую), то это также предоставляет требуемые функциональные возможности:

var myJson = '{"result": true, "count": 1}';
var obj = angular.fromJson(myJson);//equivalent to JSON.parse(myJson)
var backToJson = angular.toJson(obj);//equivalent to JSON.stringify(obj)

Я просто хотел добавить материал об AngularJS, чтобы предоставить другой вариант. Обратите внимание, что AngularJS официально не поддерживает Internet Explorer 8 (и более старые версии, если на то пошло), хотя благодаря опыту большая часть материала, похоже, работает очень хорошо.

4

Если вы используете jQuery, это просто:

var response = '{"result":true,"count":1}';
var obj = $.parseJSON(response);
alert(obj.result); //true
alert(obj.count); //1
  • 2
    Такой же ответ уже представлен по этому вопросу. stackoverflow.com/a/16953423/2392330
  • 0
    извините, я не видел этого выше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню