Analisar JSON em JavaScript?

Eu quero analisar uma string JSON em JavaScript. A resposta é algo como

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

Como posso obter o result dos valores e count com isso?

A maioria dos navegadores suporta JSON.parse() , que é definido na ECMA-262 5th Edition (a especificação na qual o JavaScript é baseado). Seu uso é simples:

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

Para os navegadores que você não pode implementá-lo usando json2.js .

Como observado nos comentários, se você já estiver usando o jQuery, há uma function $.parseJSON que mapeia para JSON.parse se disponível, ou uma forma de eval em navegadores mais antigos. No entanto, isso executa verificações adicionais e desnecessárias que também são realizadas pelo JSON.parse , portanto, para o melhor desempenho geral, recomendo usá-lo da seguinte forma:

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

Isso garantirá que você use o JSON.parse nativo imediatamente, em vez de fazer com que o jQuery execute verificações de JSON.parse na cadeia de caracteres antes de transmiti-la à function de análise nativa.

Primeiro de tudo, você precisa ter certeza de que o código JSON é válido.

Depois disso, eu recomendaria usar uma biblioteca JavaScript, como jQuery ou Prototype, se você puder, porque essas coisas são tratadas bem nessas bibliotecas.

Por outro lado, se você não quiser usar uma biblioteca e puder garantir a validade do object JSON, eu simplesmente colocaria a string em uma function anônima e usaria a function eval.

Isso não é recomendado se você estiver obtendo o object JSON de outra fonte que não é absolutamente confiável, pois a function eval permite o código renegado se você desejar.

Aqui está um exemplo de uso da function eval:

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

Se você controla qual navegador está sendo usado ou não está preocupado com pessoas com um navegador mais antigo, sempre é possível usar o método JSON.parse.

Esta é realmente a solução ideal para o futuro.

Se você está recebendo isso de um site externo, pode ser útil usar o getJSON do jQuery. Se é uma lista, você pode iterar através dela com $.

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

Se você quiser usar o JSON 3 para navegadores mais antigos, você pode carregá-lo condicionalmente com:

  

Agora, o object window.JSON padrão está disponível para você, independentemente do navegador que um cliente esteja executando.

O exemplo a seguir deixará claro:

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

OU

Você também pode usar a function eval . O exemplo a seguir está usando a function eval :

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

Como a function JSON.parse é mais segura e executa mais rápido que a function eval, recomendo que você use a function JSON.parse .

Você pode usar a function eval como em algumas outras respostas. (Não se esqueça das chaves extras.) Você saberá por que, quando for mais fundo, ou simplesmente use a function jQuery parseJSON :

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

OU

Você pode usar este código abaixo.

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

E você pode acessar os campos usando jsonObject.result e jsonObject.count .

Se você passar uma variável de string (uma string JSON bem formada) para JSON.parse de MVC @Viewbag que tem doublequote, ‘”‘, aspas, você precisa processá-la antes de JSON.parse ( jsonstring )

  var jsonstring = '@ViewBag.jsonstring'; jsonstring = jsonstring.replace(/"/g, '"'); 

A maneira mais fácil usando o método parse() :

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

Este é um exemplo de como obter valores:

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

Sem usar uma biblioteca, você pode usar eval – a única vez que você deve usar. É mais seguro usar uma biblioteca.

por exemplo…

 var response = '{"result":true , "count":1}'; var parsedJSON = eval('('+response+')'); var result=parsedJSON.result; var count=parsedJSON.count; alert('result:'+result+' count:'+count); 

JSON.parse () converte qualquer string JSON passada para a function, para um object JSON.

Para entender melhor, pressione F12 para abrir o Elemento de Inspeção do seu navegador e vá até o console para escrever os seguintes comandos:

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

Agora execute o comando:

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

Você obterá a saída como Objeto {result: true, count: 1}.

Para usar esse object, você pode atribuí-lo à variável, digamos obj :

 var obj = JSON.parse(response); 

Agora, usando obj e o operador dot (.), Você pode acessar as propriedades do Objeto JSON.

Tente executar o comando

 console.log(obj.result); 

Se você gostar

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

você pode acessar os elementos JSON por JsonObject com (.) dot:

 JsonObject.result; JsonObject.count; 

Eu pensei que JSON.parse(myObject) funcionaria. Mas, dependendo dos navegadores, pode valer a pena usar eval('('+myObject+')') . O único problema que posso recomendar é a lista de vários níveis no JSON.

Uma maneira fácil de fazer isso:

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

Se você usa o jQuery, é simples:

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

Se você usar o Dojo Toolkit :

 require(["dojo/json"], function(JSON){ JSON.parse('{"hello":"world"}', true); }); 

Como mencionado por muitos outros, a maioria dos navegadores suporta JSON.parse e JSON.stringify .

Agora, eu também gostaria de acrescentar que se você estiver usando o AngularJS (que eu recomendo), ele também fornece a funcionalidade que você precisa:

 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) 

Eu só queria adicionar o material sobre o AngularJS para fornecer outra opção. OBSERVE que o AngularJS não suporta oficialmente o Internet Explorer 8 (e versões mais antigas), embora, por experiência, a maioria das coisas pareça funcionar muito bem.