Я хочу разбирать строку JSON в JavaScript. Ответ - это что-то вроде
var response = '{"result":true,"count":1}';
Как я могу получить значения result
и count
из этого?
Большинство браузеров поддерживают 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 выполнял проверки здравомыслия в строке перед передачей его на нативную функцию синтаксического анализа.
JSON.parse()
. Для IE 6, 7 и других старых браузеров вы можете использовать json2.js, на который я ссылался из моего поста. В качестве альтернативы, но менее безопасно, вы можете использовать eval
.
Прежде всего, вы должны убедиться, что код 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.
Это действительно идеальное решение для будущего.
Если вы получаете это с внешнего сайта, может быть полезно использовать jQuery getJSON. Если это список, вы можете перебирать его с помощью $.each
$.getJSON(url, function (json) {
alert(json.result);
$.each(json.list, function (i, fb) {
alert(fb.result);
});
});
Если вы хотите использовать JSON 3 для старых браузеров, вы можете загрузить его условно:
<script>
window.JSON ||
document.write('<script src="/json3.min.js"><\/scr'+'ipt>');
</script>
Теперь стандартный объект window.JSON
доступен вам независимо от того, в каком браузере работает клиент.
json3.min.js
. Это не дает вам обратный вызов, когда он доступен. Таким образом, ваш код может работать сегодня, но не будет работать в среду, когда cdnjs.cloudflare.com неожиданно работает медленнее, чем обычно, или сеть загружена или по одной из 10000 других причин. Требуй JS вместо.
В следующем примере будет ясно:
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
.
eval()
ОПАСНО
Вы можете использовать функцию 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
.
Если вы передаете строчную переменную (хорошо сформированную строку JSON) в JSON.parse из MVC @Viewbag, которая имеет двойную кавычку, '' ', в качестве кавычек, вам нужно обработать ее перед JSON.parse(jsonstring
)
var jsonstring = '@ViewBag.jsonstring';
jsonstring = jsonstring.replace(/"/g, '"');
Самый простой способ с использованием метода parse()
:
var response = '{"a":true,"b":1}';
var JsonObject= JSON.parse(response);
это пример того, как получить значения:
var myResponseResult = JsonObject.a;
var myResponseCount = JsonObject.b;
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);
Без использования библиотеки вы можете использовать eval
- единственный раз, когда вы должны использовать. Однако безопаснее использовать библиотеку.
например,...
var response = '{"result":true , "count":1}';
var parsedJSON = eval('('+response+')');
var result=parsedJSON.result;
var count=parsedJSON.count;
alert('result:'+result+' count:'+count);
Если вам нравится
var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);
вы можете получить доступ к элементам JSON JsonObject с помощью (.) точки:
JsonObject.result;
JsonObject.count;
Я думал, что JSON.parse(myObject)
будет работать. Но в зависимости от браузеров, возможно, стоит использовать eval('('+myObject+')')
. Единственная проблема, которую я могу порекомендовать, - это многоуровневый список в JSON.
Простой способ сделать это:
var data = '{"result":true,"count":1}';
var json = eval("[" +data+ "]")[0]; // ;)
Если вы используете Dojo Toolkit:
require(["dojo/json"], function(JSON){
JSON.parse('{"hello":"world"}', true);
});
Как упоминалось многими другими, большинство браузеров поддерживают 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 (и более старые версии, если на то пошло), хотя благодаря опыту большая часть материала, похоже, работает очень хорошо.
Если вы используете jQuery, это просто:
var response = '{"result":true,"count":1}';
var obj = $.parseJSON(response);
alert(obj.result); //true
alert(obj.count); //1