Rückseite von JSON.stringify?

338

Ich fädle ein Objekt wie {'foo': 'bar'}

Wie kann ich die Zeichenfolge wieder in ein Objekt umwandeln?

thelolcat
quelle
6
Beachten Sie, dass {foo: 'bar'}JSON nicht gültig ist (obwohl es sich um einen gültigen Javascript-Ausdruck handelt).
Leemes
2
Versuchen Sie einfach JSON.parse. Wenn Ihr Browser keine Unterstützung hat, versuchen Sie es mit json2.js
Anirudha Gupta
10
Leute, wir haben es hier mit einem Lolcat zu tun.
Pointy
1
Vielleicht hätte ich eine weitere (vierte) Antwort hinzufügen sollen, die besagt, dass Sie JSON.parse machen sollten ...
Titouan de Bailleul
33
@RobW, es stellt sich heraus, dass Ihr Google-Link auf diese Frage als Top-Hit verweist. #ironic
Chase Florell

Antworten:

501

Sie müssen JSON.parse()die Zeichenfolge.

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
quelle
8
Pro-Tipp: Setzen Sie JSON.parse () immer in Try-Catch-Strukturen ein, da die Methode Ihren Node / Js
Spock am
74

JSON.parseist das Gegenteil von JSON.stringify.

Niet the Dark Absol
quelle
62

JSON.stringifyund JSON.parsesind fast entgegengesetzt, und "normalerweise" wird so etwas funktionieren:

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

so dass obj und obj2 "gleich" sind.

Es sind jedoch einige Einschränkungen zu beachten. Oft spielen diese Probleme keine Rolle, wenn Sie mit einfachen Objekten arbeiten. Aber ich werde einige von ihnen hier mit dieser Hilfsfunktion veranschaulichen:

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • Sie werden nur ownPropertiesvom Objekt kommen und Prototypen verlieren:

    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
  • Sie verlieren Identität:

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo ); // false
  • Funktionen überleben nicht:

    jsonrepack( { f:function(){} } ); // Returns {}
  • Datumsobjekte enden als Zeichenfolgen:

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
  • Undefinierte Werte überleben nicht:

    var v = { x:undefined }
    console.log("x" in v);              // true
    console.log("x" in jsonrepack(v));  // false
  • Objekte, die eine toJSONFunktion bereitstellen, verhalten sich möglicherweise nicht richtig.

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

Ich bin sicher, dass es auch Probleme mit anderen integrierten Typen gibt. (All dies wurde mit node.js getestet, sodass Sie je nach Umgebung möglicherweise ein leicht unterschiedliches Verhalten erhalten.)

Wenn es darauf ankommt, kann es manchmal mit den zusätzlichen Parametern von JSON.parseund überwunden werden JSON.stringify. Zum Beispiel:

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
quelle
1
Laut "JSON ist ein Textformat, das vollständig sprachunabhängig ist, jedoch Konventionen verwendet, die Programmierern der C-Sprachfamilie vertraut sind, einschließlich C, C ++, C #, Java, JavaScript, Perl, Python und vielen anderen." . Für mich bedeutet dies, dass JSON nur für sprachunabhängige Typen / Daten verwendet werden sollte. Daher bezieht sich Ihr Beispiel (obwohl es sehr gültig ist) nur auf JSON in seiner Zuordnung zu JavaScript und sollte eher als JSONP definiert werden und nicht als echtes JSON ... IMOJSON SPEC
Chase Florell
Ein Beispiel hierfür ist, dass { bar:"bar" }(von Ihrem Prototyp) nicht als gültiger json angesehen wird, da fooes sich eher um eine Variable als um eine Zeichenfolge handelt. Gültiger JSON muss keyein sein string.
Chase Florell
3
Ich habe das OP mit den Worten gelesen: "Ich habe ein Javascript-Objekt in eine JSON-Zeichenfolge konvertiert, und jetzt möchte ich es zurückkonvertieren - wie mache ich das?" Alle anderen Antworten sagen nur verwenden JSON.parse. Ich warne nur, dass es viele Fälle gibt, die nicht richtig behandelt werden. Wenn Sie reine primitive Daten (keine Klassen, Prototypen) und nur die von JSON unterstützten Datentypen (keine Daten, XML, HTML usw.) verwenden, sind Sie in Ordnung.
Michael Anderson
Auch in Javascript X = { foo:"bar" }ist das gleiche wie X = { "foo":"bar" }das gleiche wie X = {}; X.foo = "bar"das gleiche wie X={}; X["foo"] = "bar"Das resultierende Objekt ist in allen 4 Fällen identisch. Dies hat keinen Einfluss auf die Gültigkeit des generierten JSON.
Michael Anderson
2
Dies ist eine außerordentlich umfassende Antwort, die es weitaus mehr wert ist, akzeptiert zu werden. Vielen Dank für Ihre hervorragende Arbeit.
Scubbo
6

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

Das native JSON-Objekt enthält zwei Schlüsselmethoden.

1. JSON.parse()
2. JSON.stringify() 
  1. Die JSON.parse()Methode analysiert eine JSON-Zeichenfolge, dh die Rekonstruktion des ursprünglichen JavaScript-Objekts

    var jsObject = JSON.parse(jsonString);

  2. Die Methode JSON.stringify () akzeptiert ein JavaScript-Objekt und gibt das JSON-Äquivalent zurück.

    var jsonString = JSON.stringify(jsObject);

Shaik Rasool
quelle
5

Wie wäre es damit

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

Dies ist eine sicherere Alternative für eval.

Ausnahme
quelle
2

Überprüfen Sie dies heraus.
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);
Manish Gupta
quelle
-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
quelle