Inverse de JSON.stringify?


341

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

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


6
Notez que ce {foo: 'bar'}n'est pas un JSON valide (alors qu'il s'agit d'une expression javascript valide).
leemes

2
essayez simplement JSON.parse. si votre navigateur n'est pas compatible, essayez json2.js
Anirudha Gupta

10
les gars, nous avons affaire à un lolcat ici.
Pointy

1
J'aurais peut-être dû ajouter une autre réponse (lire quatrième) disant que vous devriez faire JSON.parse ...
Titouan de Bailleul

33
@RobW, il s'avère que votre lien google renvoie à cette question comme étant le top hit. #ironic
Chase Florell

Réponses:


502

Vous avez besoin de 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);
}


8
Astuce de pro: mettez toujours JSON.parse () dans des structures try-catch, car la méthode peut planter votre Node / Js
Spock


63

JSON.stringifyet JSON.parsesont presque opposés, et "généralement" ce genre de chose fonctionnera:

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

de sorte que obj et obj2 sont "identiques".

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'assistance:

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • Vous n'obtiendrez que ownPropertiesl'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 perdrez 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 sous forme de chaînes:

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
  • Les valeurs indé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 toJSONfonction peuvent ne pas se comporter correctement.

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

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

Lorsque cela est important, il peut parfois être surmonté en utilisant les paramètres supplémentaires de JSON.parseet 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

1
Selon le "JSON est un format de texte qui est complètement indépendant du langage mais utilise des conventions qui sont familières aux programmeurs de la famille C des langages, y compris C, C ++, C #, Java, JavaScript, Perl, Python et bien d'autres." . Pour moi, cela signifie que JSON ne doit être utilisé que pour les types / données indépendants du langage. Par conséquent, votre exemple (bien que très valide) ne concerne que JSON dans son association à JavaScript, et devrait être plus défini comme JSONP, et non comme vrai JSON ... IMOJSON SPEC
Chase Florell

Un exemple de ceci est que { bar:"bar" }(à partir de votre prototype) n'est pas considéré comme un json valide car il foos'agit d'une variable plutôt que d'une chaîne. Un json valide doit keyêtre un string.
Chase Florell

3
J'ai lu l'OP comme disant "J'ai converti un objet javascript en une chaîne JSON, et maintenant je veux le reconvertir - comment faire?" Toutes les autres réponses disent simplement utiliser JSON.parse. J'avertis juste qu'il y a beaucoup de cas qui ne seront pas traités correctement. Si vous utilisez des données primitives pures (pas de classes, prototypes) et uniquement les types de données pris en charge par JSON (pas de dates, XML, HTML, etc.), alors vous êtes OK.
Michael Anderson

Également en Javascript X = { foo:"bar" }est le même que celui X = { "foo":"bar" }qui est le même que celui X = {}; X.foo = "bar"qui est le même que l' X={}; X["foo"] = "bar"objet résultant est identique dans les 4 cas. Cela ne change rien à la validité du JSON généré.
Michael Anderson

2
Il s'agit d'une réponse extrêmement complète et bien plus digne d'être la réponse acceptée. Merci pour votre excellent travail.
scubbo

6

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

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

1. JSON.parse()
2. JSON.stringify() 
  1. La JSON.parse()méthode analyse une chaîne JSON - c'est-à-dire la reconstruction de 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

Que dis-tu de ça

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

Il s'agit d'une alternative plus sûre pour eval.


2

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);

-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();
        }
    });
});
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.