Reverso de JSON.stringify?

341

Estoy encadenando un objeto como {'foo': 'bar'}

¿Cómo puedo volver la cadena a un objeto?

thelolcat
fuente
66
Tenga en cuenta que {foo: 'bar'}no es válido JSON (si bien es una expresión de javascript válida).
leemes
2
simplemente intente JSON.parse. si su navegador no tiene soporte, intente json2.js
Anirudha Gupta
10
chicos, estamos lidiando con un lolcat aquí.
Puntiagudo
1
Tal vez debería haber agregado otra (lea la cuarta) respuesta diciendo que debería hacer JSON.parse ...
Titouan de Bailleul
33
@RobW, resulta que su enlace de Google apunta a esta pregunta como el mejor éxito. #ironic
Chase Florell

Respuestas:

502

Necesitas JSON.parse()la cuerda.

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
fuente
8
Consejo profesional: siempre coloque JSON.parse () en estructuras try-catch, ya que el método puede bloquear su Node / Js
Spock
74

JSON.parsees lo contrario de JSON.stringify.

Niet the Dark Absol
fuente
63

JSON.stringifyy JSON.parseson casi opuestos, y "generalmente" este tipo de cosas funcionarán:

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

para que obj y obj2 sean "lo mismo".

Sin embargo, hay algunas limitaciones a tener en cuenta. A menudo, estos problemas no importan, ya que se trata de objetos simples. Pero ilustraré algunos de ellos aquí, usando esta función auxiliar:

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • Solo obtendrás ownPropertiesel objeto y perderás prototipos:

    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
  • Perderás identidad:

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo ); // false
  • Las funciones no sobreviven:

    jsonrepack( { f:function(){} } ); // Returns {}
  • Los objetos de fecha terminan como cadenas:

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
  • Los valores indefinidos no sobreviven:

    var v = { x:undefined }
    console.log("x" in v);              // true
    console.log("x" in jsonrepack(v));  // false
  • Los objetos que proporcionan una toJSONfunción pueden no comportarse correctamente.

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

Estoy seguro de que también hay problemas con otros tipos integrados. (Todo esto se probó usando node.js, por lo que también puede obtener un comportamiento ligeramente diferente dependiendo de su entorno).

Cuando importa, a veces puede superarse utilizando los parámetros adicionales de JSON.parsey JSON.stringify. Por ejemplo:

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
fuente
1
Según el "JSON es un formato de texto que es completamente independiente del lenguaje pero utiliza convenciones que son familiares para los programadores de la familia de lenguajes C, incluidos C, C ++, C #, Java, JavaScript, Perl, Python y muchos otros". . Para mí, esto dice que JSON solo debe usarse para tipos / datos independientes del idioma. Por lo tanto, su ejemplo (aunque es muy válido) solo se relaciona con JSON en su asociación con JavaScript, y debe definirse más como JSONP, y no como JSON verdadero ... IMOJSON SPEC
Chase Florell
Un ejemplo de esto es que { bar:"bar" }(desde su prototipo) no se considera json válido ya que fooes una variable en lugar de una cadena. Json válido necesita keyque sea a string.
Chase Florell
3
Leí el OP como diciendo "Convertí un objeto javascript en una cadena JSON, y ahora quiero volver a convertirlo, ¿cómo lo hago?" Todas las otras respuestas dicen simplemente use JSON.parse. Solo estoy advirtiendo que hay muchos casos que no se manejarán correctamente. Si está utilizando datos primitivos puros (sin clases, prototipos) y solo los tipos de datos admitidos por JSON (sin fechas, XML, HTML, etc.), entonces está bien.
Michael Anderson
También en Javascript X = { foo:"bar" }es lo mismo X = { "foo":"bar" }que lo X = {}; X.foo = "bar"que es lo mismo que X={}; X["foo"] = "bar"El objeto resultante es idéntico en los 4 casos. Eso no hace ninguna diferencia en la validez del JSON generado.
Michael Anderson
2
Esta es una respuesta extraordinariamente completa, y mucho más digna de ser la respuesta aceptada. Gracias por tu excelente trabajo.
scubbo
6

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

El objeto JSON nativo incluye dos métodos clave.

1. JSON.parse()
2. JSON.stringify() 
  1. El JSON.parse()método analiza una cadena JSON, es decir, reconstruye el objeto JavaScript original

    var jsObject = JSON.parse(jsonString);

  2. El método JSON.stringify () acepta un objeto JavaScript y devuelve su equivalente JSON.

    var jsonString = JSON.stringify(jsObject);

Shaik Rasool
fuente
5

Qué tal esto

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

Esta es una alternativa más segura para eval.

Excepción
fuente
2

Mira esto.
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
fuente
-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
fuente