web-dev-qa-db-fra.com

Reverse de JSON.stringify?

Je stringyfing un objet comme {'foo': 'bar'}

Comment puis-je retourner la chaîne à un objet?

308
thelolcat

Vous devez JSON.parse() la chaîne.

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);
}
458
Chase Florell

JSON.parse est l'opposé de JSON.stringify.

66

JSON.stringify et JSON.parse sont presque des opposés, et "habituellement" ce genre de chose fonctionnera:

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

de sorte que obj et obj2 sont "les mêmes".

Cependant, il y a certaines limites à connaître. Souvent, ces problèmes n'ont pas d'importance, car vous traitez avec des objets simples. Mais je vais illustrer certains d’entre eux ici, en utilisant cette fonction d’aide:

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • Vous n'obtiendrez que ownProperties de l'objet et perdrez des prototypes:

    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
    
  • Vous allez perdre votre identité:

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo ); // false
    
  • Les fonctions ne survivent pas:

    jsonrepack( { f:function(){} } ); // Returns {}
    
  • Les objets de date finissent comme des chaînes:

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
    
  • Les valeurs non définies ne survivent pas:

    var v = { x:undefined }
    console.log("x" in v);              // true
    console.log("x" in jsonrepack(v));  // false
    
  • Les objets qui fournissent une fonction toJSON peuvent ne pas se comporter correctement.

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

Je suis sûr qu'il existe également des problèmes avec d'autres types intégrés. (Tout cela a été testé avec node.js, vous pouvez donc avoir un comportement légèrement différent en fonction de votre environnement).

Lorsque cela est important, il peut parfois être surmonté en utilisant les paramètres supplémentaires de JSON.parse et JSON.stringify. Par exemple:

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
58
Michael Anderson

Recommandé est d'utiliser JSON.parse

Il y a une alternative que vous pouvez faire:

 var myObject = eval('(' + myJSONtext + ')');

Json en javascript

Pourquoi l'utilisation de la fonction JavaScript eval est-elle une mauvaise idée?

5
Mina Gabriel

Que dis-tu de ça

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

C'est une alternative plus sûre pour eval.

var stringifiedJSON = '{"hello":"world"}';
var parsed = new Function('return ' + stringifiedJSON)();
alert(parsed.hello);
5
Exception

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

L'objet JSON natif comprend deux méthodes de clé.

1. JSON.parse()
2. JSON.stringify() 
  1. La méthode JSON.parse() analyse une chaîne JSON, c'est-à-dire qu'elle reconstruit l'objet JavaScript d'origine.

    var jsObject = JSON.parse(jsonString);

  2. La méthode JSON.stringify () accepte un objet JavaScript et renvoie son équivalent JSON.

    var jsonString = JSON.stringify(jsObject);

5
Shaik Rasool

Regarde ça.
http://jsfiddle.net/LD55x/

Code:

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);
2
Manish Gupta