Reverso do JSON.stringify?

338

Estou pressionando um objeto como {'foo': 'bar'}

Como posso transformar a string de volta em um objeto?

thelolcat
fonte
6
Observe que {foo: 'bar'}JSON não é válido (embora seja uma expressão javascript válida).
leemes
2
simplesmente tente JSON.parse. se o seu navegador não têm suporte em seguida, tentar json2.js
Anirudha Gupta
10
caras que estamos lidando com um lolcat aqui.
Pointy
11
Talvez eu devesse ter acrescentado um outro (leia quarta) resposta dizendo que você deve fazer JSON.parse ...
Titouan de Bailleul
33
@ RobW, verifica-se que o seu link do google aponta para essa pergunta como a principal ocorrência. #ironic
Chase Florell

Respostas:

501

Você precisa JSON.parse()da string.

var str = '{"hello":"world"}';
try {
  var obj = JSON.parse(str); // this is how you parse a string into JSON 
  document.body.innerHTML += obj.hello;
} catch (ex) {
  console.error(ex);
}

Chase Florell
fonte
8
Dica profissional: sempre coloque JSON.parse () em estruturas try-catch, pois o método pode travar seus nós / nós
Spock
74

JSON.parseé o oposto de JSON.stringify.

Niet, o Escuro Absol
fonte
62

JSON.stringifye JSON.parsesão quase opostos, e "geralmente" esse tipo de coisa funcionará:

var obj = ...;
var json = JSON.stringify(obj);  
var obj2 = JSON.parse(json);

para que obj e obj2 sejam "iguais".

No entanto, existem algumas limitações a serem observadas. Geralmente, esses problemas não importam, pois você lida com objetos simples. Mas ilustrarei alguns deles aqui, usando esta função auxiliar:

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • Você só conseguirá ownPropertieso objeto e perderá protótipos:

    var MyClass = function() { this.foo="foo"; } 
    MyClass.prototype = { bar:"bar" }
    
    var o = new MyClass();
    var oo = jsonrepack(o);
    console.log(oo.bar); // undefined
    console.log( oo instanceof MyClass ); // false
  • Você perderá a identidade:

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo ); // false
  • As funções não sobrevivem:

    jsonrepack( { f:function(){} } ); // Returns {}
  • Os objetos de data terminam como seqüências de caracteres:

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
  • Valores indefinidos não sobrevivem:

    var v = { x:undefined }
    console.log("x" in v);              // true
    console.log("x" in jsonrepack(v));  // false
  • Objetos que fornecem uma toJSONfunção podem não se comportar corretamente.

    x = { f:"foo", toJSON:function(){ return "EGAD"; } }
    jsonrepack(x) // Returns 'EGAD'

Tenho certeza de que também há problemas com outros tipos internos. (Tudo isso foi testado usando o node.js, para que você possa ter um comportamento um pouco diferente dependendo do seu ambiente também).

Quando isso importa, às vezes pode ser superado usando os parâmetros adicionais de JSON.parsee JSON.stringify. Por exemplo:

function MyClass (v) {
   this.date = new Date(v.year,1,1);
   this.name = "an object";
};

MyClass.prototype.dance = function() {console.log("I'm dancing"); }

var o = new MyClass({year:2010});
var s = JSON.stringify(o);

// Smart unpack function
var o2 = JSON.parse( s, function(k,v){
  if(k==="") { 
     var rv = new MyClass(1990,0,0);
     rv.date = v.date;
     rv.name = v.name;
     return rv
  } else if(k==="date") {
    return new Date( Date.parse(v) );
  } else { return v; } } );

console.log(o);             // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o.constructor); // [Function: MyClass]
o.dance();                  // I'm dancing

console.log(o2);            // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o2.constructor) // [Function: MyClass]        
o2.dance();                 // I'm dancing
Michael Anderson
fonte
11
De acordo com o "JSON é um formato de texto que é completamente independente da linguagem, mas usa convenções familiares aos programadores da família C de linguagens, incluindo C, C ++, C #, Java, JavaScript, Perl, Python e muitos outros." . Para mim, isso diz que o JSON deve ser usado apenas para tipos / dados independentes de idioma. Portanto, o seu exemplo (embora muito válido) diz respeito apenas às JSON nele associação para JavaScript, e deve ser definido como JSONP mais-lo, e não é verdade JSON ... IMOJSON SPEC
Perseguição Florell
Um exemplo disso é que { bar:"bar" }(do seu protótipo) não é considerado json válido, pois fooé uma variável e não uma string. O json válido precisa keyser a string.
Perseguição Florell
3
Eu li o OP dizendo "Converti um objeto javascript em uma string JSON e agora quero convertê-lo novamente - como faço isso?" Todas as outras respostas dizem apenas usar JSON.parse. Só estou avisando que existem muitos casos que não serão tratados corretamente. Se você estiver usando dados primitivos puros (sem classes, protótipos) e apenas os tipos de dados suportados pelo JSON (sem datas, XML, HTML etc.), estará bem.
Michael Anderson
Também em Javascript X = { foo:"bar" }é o mesmo X = { "foo":"bar" }que é o mesmo X = {}; X.foo = "bar"que X={}; X["foo"] = "bar"O objeto resultante é idêntico em todos os 4 casos. Isso não faz diferença para a validade do JSON gerado.
Michael Anderson
2
Essa é uma resposta excepcionalmente abrangente e muito mais digna de ser a resposta aceita. Obrigado pelo seu excelente trabalho.
Scubbo
6

http://jsbin.com/tidob/1/edit?js,console,output

O objeto JSON nativo inclui dois métodos principais.

1. JSON.parse()
2. JSON.stringify() 
  1. O JSON.parse()método analisa uma string JSON - isto é, reconstruindo o objeto JavaScript original

    var jsObject = JSON.parse(jsonString);

  2. O método JSON.stringify () aceita um objeto JavaScript e retorna seu equivalente em JSON.

    var jsonString = JSON.stringify(jsObject);

Shaik Rasool
fonte
5

Que tal agora

var parsed = new Function('return ' + stringifiedJSON )();

Esta é uma alternativa mais segura para eval.

Exceção
fonte
2

Veja isso.
http://jsfiddle.net/LD55x/

Código:

var myobj = {};
myobj.name="javascriptisawesome";
myobj.age=25;
myobj.mobile=123456789;
debugger;
var str = JSON.stringify(myobj);
alert(str);
var obj = JSON.parse(str);
alert(obj);
Manish Gupta
fonte
-3
$("#save").click(function () {
    debugger
    var xx = [];
    var dd = { "firstname": "", "lastname": "", "address": "" };
    var otable1 = $("#table1").dataTable().fnGetData();

    for (var i = 0; i < otable1.length; i++) {
        dd.firstname = otable1[i][0];
        dd.lastname = otable1[i][1];
        dd.address = otable1[i][2];
        xx.push(dd);
        var dd = { "firstname": "", "lastname": "", "address": "" };
    }
    JSON.stringify(alert(xx));
    $.ajax({

        url: '../Home/save',
        type: 'POST',
        data: JSON.stringify({ u: xx }),
        contentType: 'application/json;',
        dataType: 'json',
        success: function (event) {
            alert(event);
            $("#table2").dataTable().fnDraw();
            location.reload();
        }
    });
});
suresh64
fonte