2011-11-17 20 views
45

ho questo prototipo javascript:serialize javascript oggetto in una stringa JSON

Utils.MyClass1 = function(id, member) { 
this.id = id; 
this.member = member; 
} 

e ho creare un nuovo oggetto:

var myobject = new MyClass1("5678999", "text"); 

se faccio:

console.log(JSON.stringify(myobject)); 

Il risultato is:

{"id":"5678999", "member":"text"} 

ma ho bisogno che il typeof gli oggetti include nella stringa JSON, in questo modo:

"MyClass1": { "id":"5678999", "member":"text"} 

ci sono un modo veloce utilizzando qualsiasi quadro o qualcosa del genere? o ho bisogno di implementare il metodo toJson() nella classe e farlo manualmente.

Grazie!

risposta

56
var myobject = new MyClass1("5678999", "text"); 
var dto = { MyClass1: myobject }; 
console.log(JSON.stringify(dto)); 

EDIT:

JSON.stringify in stringa i tutte 'proprietà' della vostra classe. Se si vuole persistere solo alcuni di essi, è possibile specificare singolarmente come questo:

var dto = { MyClass1: { 
    property1: myobject.property1, 
    property2: myobject.property2 
}}; 
+1

è una buona idea, ma non solo hanno un MyClass di classe, all'interno di MyClass ho molto da attribuire es che sono oggetti, e io non lo so. – Kalamarico

+1

È possibile utilizzare myobject.constructor. Vedi la mia risposta o https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/constructor per maggiori informazioni! –

3

È possibile utilizzare una funzione chiamata sul costruttore.

MyClass1 = function foo(id, member) { 
    this.id = id; 
    this.member = member; 
} 

var myobject = new MyClass1("5678999", "text"); 

console.log(myobject.constructor); 

//function foo(id, member) { 
// this.id = id; 
// this.member = member; 
//} 

si potrebbe usare una regex per analizzare fuori 'foo' dal myobject.constructor e l'uso che per ottenere il nome.

4

Bene, il tipo di un elemento non è serializzato standard, quindi è necessario aggiungerlo manualmente. Per esempio

var myobject = new MyClass1("5678999", "text"); 
var toJSONobject = { objectType: myobject.constructor, objectProperties: myobject }; 
console.log(JSON.stringify(toJSONobject)); 

Buona fortuna!

modifica: modifica del tipo del corretto costruttore. Vedere https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/constructor per ulteriori informazioni sulla proprietà del costruttore per gli oggetti.

3

Qui di seguito è un altro modo in cui possiamo dati JSON con JSON.stringify() funzione

var Utils = {}; 
Utils.MyClass1 = function (id, member) { 
    this.id = id; 
    this.member = member; 
} 
var myobject = { MyClass1: new Utils.MyClass1("5678999", "text") }; 
alert(JSON.stringify(myobject)); 
2

ho risolto il mio problema in questo modo, non il modo migliore, ovviamente, ma è interessante per condividere:

ho cambiato direttamente la libreria json2.js (di fronte alla best practice ...), il metodo cambiato JSON.stringify() e str() quando si legge un oggetto ho messo prima del typeof:

// Otherwise, iterate through all of the keys in the object. 
// I have introduced speechModify variable. 
var speechModify = false; 
if(value.classname) { 
    partial.push('"' + value.classname + '":{'); 
    speechModify = true; 
} 

Questo è solo per aggiungere un attributo classname nelle mie classi. E dopo l'iterazione, aggiunge questa frase:

if(speechModify) 
    partial.push("}"); 

// Join all of the member texts together, separated with commas, 
// and wrap them in braces. 

v = partial.length === 0 
    ? '{}' 
    : gap 
     ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' 
     : '{' + partial.join(',') + '}'; 
gap = mind; 

v = v.replace("{,","{"); 
v = v.replace(",}", "}"); 
4

Questo potrebbe essere utile. http://nanodeath.github.com/HydrateJS/ https://github.com/nanodeath/HydrateJS

Usa hydrate.stringify per serializzare l'oggetto e hydrate.parse per deserializzare.

+0

HydrateJS sembra gestire correttamente sia la serializzazione delle funzioni che i riferimenti circolari. Non molte librerie fanno! +1 –

+0

Sfortunatamente, HydrateJS è anche scarsamente documentato e apparentemente non mantenuto –

10

se è solo un JSON si può stringa i Un JSON:

var obj = { 
    cons: [[String, 'some', 'somemore']], 
    func: function(param, param2){ 
     param2.some = 'bla'; 
    } 
}; 

var text = JSON.stringify(obj); 

e analizzare a JSON nuovamente parse:

var myVar = JSON.parse(text); 

se si dispone di funzioni nell'oggetto Usa questa di serializzare:

function objToString(obj, ndeep) { 
    switch(typeof obj){ 
    case "string": return '"'+obj+'"'; 
    case "function": return obj.name || obj.toString(); 
    case "object": 
     var indent = Array(ndeep||1).join('\t'), isArray = Array.isArray(obj); 
     return ('{['[+isArray] + Object.keys(obj).map(function(key){ 
      return '\n\t' + indent +(isArray?'': key + ': ')+ objToString(obj[key], (ndeep||1)+1); 
     }).join(',') + '\n' + indent + '}]'[+isArray]).replace(/[\s\t\n]+(?=(?:[^\'"]*[\'"][^\'"]*[\'"])*[^\'"]*$)/g,''); 
    default: return obj.toString(); 
    } 
} 

Esempio

Serialize:

var text = objToString(obj); //To Serialize Object 

Risultato:

"{cons:[[String,"some","somemore"]],func:function(param,param2){param2.some='bla';}}" 

unserialize:

Var myObj = eval('('+text+')');//To UnSerialize 

Risultato:

Object {cons: Array[1], func: function, spoof: function}