Ich fädle ein Objekt wie {'foo': 'bar'}
Wie kann ich die Zeichenfolge wieder in ein Objekt umwandeln?
Ich fädle ein Objekt wie {'foo': 'bar'}
Wie kann ich die Zeichenfolge wieder in ein Objekt umwandeln?
Antworten:
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);
}
JSON.parse
ist das Gegenteil von JSON.stringify
.
JSON.stringify
und JSON.parse
sind 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 ownProperties
vom 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 toJSON
Funktion 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.parse
und ü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
JSON SPEC
{ bar:"bar" }
(von Ihrem Prototyp) nicht als gültiger json angesehen wird, da foo
es sich eher um eine Variable als um eine Zeichenfolge handelt. Gültiger JSON muss key
ein sein string
.
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.
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.
http://jsbin.com/tidob/1/edit?js,console,output
Das native JSON-Objekt enthält zwei Schlüsselmethoden.
1. JSON.parse()
2. JSON.stringify()
Die JSON.parse()
Methode analysiert eine JSON-Zeichenfolge, dh die Rekonstruktion des ursprünglichen JavaScript-Objekts
var jsObject = JSON.parse(jsonString);
Die Methode JSON.stringify () akzeptiert ein JavaScript-Objekt und gibt das JSON-Äquivalent zurück.
var jsonString = JSON.stringify(jsObject);
Empfohlen wird zu verwenden JSON.parse
Es gibt eine Alternative, die Sie tun können:
var myObject = eval('(' + myJSONtext + ')');
Warum ist die Verwendung der JavaScript-Bewertungsfunktion eine schlechte Idee?
Wie wäre es damit
var parsed = new Function('return ' + stringifiedJSON )();
Dies ist eine sicherere Alternative für eval
.
Ü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);
$("#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();
}
});
});
{foo: 'bar'}
JSON nicht gültig ist (obwohl es sich um einen gültigen Javascript-Ausdruck handelt).