2009-10-19 10 views
6

Ich habe ein Objekt wie folgt:Wie verwende ich JSON, um das Javascript-Objekt neu zu erstellen?

var someObj = Class.create ({ 
    initialize: function(objName){ 
     this.objName = objName; 
    } 
}); 

I

o = new someObj("objName"); 

verwenden können, um eine obj zu machen. Ich kann Object.toJSON (o) verwenden, um das o zu einem JSON-String zu ändern, aber ich möchte, dass die JSON-Zeichenfolge zurück zu someObj konvertiert, also verwende ich eval(), um die JSON-Zeichenfolge zu einem Objekt zu übergeben Die Frage ist, es kann ein JS Obj, werden, aber der Konstruktor von "o" ist nicht someObj. Wie kann ich den JSON-String unter Verwendung von "someObj" als Konstruktor evalieren?

Antwort

5

JSON-Zeichenfolgen können keine Objekte mit Elementfunktionen darstellen. Aus einer JSON-Zeichenfolge werden also nur Rohdaten abgerufen. Unter der Annahme, dass die toJSON-Methode zu einer JSON-Zeichenfolge führt, die ein Objekt mit allen Nichtfunktionselementen Ihrer Klasseninstanz darstellt, sollten Sie das resultierende Objekt verwenden und den Prototyp anfügen können, um alle Funktionen zurückzuerhalten. Zum Beispiel mit jQuery praktisch extend Funktion:

var o = new someObj("objName"); 
var json = Object.toJSON(o); 
var json_obj = eval(json); 
$.extend(json_obj, someObj.prototype); 
json_obj.someMethodDefinedOnsomeObj() 

Je nachdem, wie das Framework Sie verwenden Klassen zu vertreten in JavaScript Verwendung des prototypischen Objektmodell, Ihre milage kann sehr mit dem obigen Beispiel macht. Außerdem erzeugt die Verwendung von eval() eine Sicherheitslücke. Wenn Sie also der Herkunft der JSON-Zeichenfolge nicht vertrauen, sollten Sie eine andere Deserialisierungsmethode verwenden. Nur für die vollständige Abdeckung, hier ist, wie ich es mit rohen Prototypen tat

function Animal(name){ 
    this.name = name; 
} 
Animal.prototype.talk = function(){ 
    console.log("My name is "+this.name); 
} 

var a = new Animal("Brendan Eich"); 
a.talk(); 

var json = '{name: "Tim Berners-Lee"}' 
var b = eval(b); 
$.extend(b, Animal.prototype); 
b.talk(); 

In einer Firebug Konsole Dies ergibt die Ausgabe:

Mein Name ist Brendan Eich

Mein Name ist Tim Berners-Lee

0

Sie verwenden prototypejs richtig? Ich fand das immer schwierig und endete damit, dass ich meinen eigenen Initialisierer erstellte, der ein Objekt einlud, das eval ed oder die JSON-Zeichenkette selbst war.

+0

Ja, ich benutze Prototyp js. – DNB5brims

2

Siehe JSON Erneuerer bei http://json.org/js.html

var myObject = JSON.parse(myJSONtext, reviver); 

Der optionale reviver Parameter ist eine Funktion, die für jeden Schlüssel und Wert auf jeder Ebene des Endergebnis genannt wird. Jeder Wert wird durch das Ergebnis der Reviver Funktion ersetzt werden. Dies kann verwendet werden, um generische Objekte in Instanzen von Pseudoklassen zu reformieren, oder um das Datum Strings in Date-Objekte umzuwandeln.

Verwandte Themen