Je chausse un objet comme {'foo': 'bar'}
Comment puis-je retourner la chaîne en un objet?
Je chausse un objet comme {'foo': 'bar'}
Comment puis-je retourner la chaîne en un objet?
Réponses:
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);
}
JSON.parse
est l'opposé de JSON.stringify
.
JSON.stringify
et JSON.parse
sont 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 ownProperties
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 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 toJSON
fonction 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.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
JSON SPEC
{ bar:"bar" }
(à partir de votre prototype) n'est pas considéré comme un json valide car il foo
s'agit d'une variable plutôt que d'une chaîne. Un json valide doit key
être un string
.
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.
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é.
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()
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);
La méthode JSON.stringify () accepte un objet JavaScript et renvoie son équivalent JSON.
var jsonString = JSON.stringify(jsObject);
Il est recommandé d'utiliser JSON.parse
Il existe une alternative que vous pouvez faire:
var myObject = eval('(' + myJSONtext + ')');
Pourquoi l'utilisation de la fonction d'évaluation JavaScript est-elle une mauvaise idée?
Que dis-tu de ça
var parsed = new Function('return ' + stringifiedJSON )();
Il s'agit d'une alternative plus sûre pour eval
.
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);
$("#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'}
n'est pas un JSON valide (alors qu'il s'agit d'une expression javascript valide).