2009-10-19 23 views
6

que tienen un objeto como éste:¿Cómo usar JSON para volver a generar el objeto Javascript?

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

que puede utilizar

o = new someObj("objName"); 

hacer un obj. Puedo usar Object.toJSON (o) para cambiar o para convertirme en una Cadena JSON, , pero quiero que la cadena JSON se convierta de nuevo en algo así que utilizo eval() para pasar la cadena JSON para convertirme en un objeto, pero la pregunta es, puede convertirse en JS Obj, pero el constructor de "o" no es algo Obj. ¿Cómo puedo evaluar la cadena JSON utilizando "someObj" como el constructor?

Respuesta

5

Las cadenas JSON no pueden representar objetos con funciones miembro, por lo que lo único que obtendrá de una cadena JSON son datos brutos. Suponiendo que el método toJSON da como resultado una cadena JSON que representa un objeto con todos los miembros no funcionales de su instancia de clase, debería poder tomar el objeto resultante y adjuntar el prototipo para recuperar todas las funciones. Por ejemplo, el uso práctico extend función de jQuery:

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

Dependiendo de cómo el marco se utiliza para representar las clases en JavaScript utiliza el modelo de objetos de prototipos, su kilometraje puede muy con el ejemplo anterior. Además, el uso de eval() crea un agujero de seguridad, por lo que si no confía de dónde viene la cadena JSON, debe usar un método de deserialización diferente. Sólo para una cobertura completa, aquí es cómo lo hice con prototipos primas:

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

En una consola de Firebug Esto produce la salida:

Mi nombre es Brendan Eich

Mi nombre es Tim Berners-Lee

0

Estás utilizando prototypejs ¿verdad? Siempre me pareció complicado y acabo de hacer mi propio inicializador que decía en un objeto que había sido eval ed o la propia cadena json.

+0

Sí, estoy usando el prototipo js. – DNB5brims

2

recuperadores Ver JSON en http://json.org/js.html

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

El parámetro opcional resucitador es una función que será llamado para cada clave y el valor en todos los niveles del resultado final . Cada valor será reemplazado por el resultado de la función reviver . Esto se puede usar para reformar objetos genéricos en instancias de pseudoclases , o para transformar cadenas de fecha en objetos de fecha.

Cuestiones relacionadas