È facile caricare JSON in un oggetto in javascript utilizzando eval o JSON.parse.Come ripristinare l'oggetto/tipo originale da JSON?
Ma se si dispone di una funzione di tipo "class" appropriata, come vengono inseriti i dati JSON?
E.g.
function Person(name) {
this.name=name;
this.address = new Array();
this.friendList;
this.promote = function(){
// do some complex stuff
}
this.addAddress = function(address) {
this.address.push(address)
}
}
var aPersonJSON = '{\"name\":\"Bob\",\"address\":[{\"street\":\"good st\",\"postcode\":\"ADSF\"}]}'
var aPerson = eval("(" + aPersonJSON + ")"); // or JSON.parse
//alert (aPerson.name); // Bob
var someAddress = {street:"bad st",postcode:"HELL"};
//alert (someAddress.street); // bad st
aPerson.addAddress(someAddress); // fail!
Il punto cruciale è che ho bisogno di essere in grado di creare istanze persona adatta da JSON, ma tutto quello che posso ottenere è un oggetto muto. Mi chiedo se è possibile fare qualcosa con i prototipi?
Non voglio analizzare ogni riga del JSON e assegnare ogni variabile agli attributi delle funzioni corrispondenti, il che sarebbe troppo difficile. Il reale JSON e le funzioni che ho sono molto più complicate rispetto all'esempio sopra.
Io parto dal presupposto si potrebbe JSONify metodi funzioni nella stringa JSON, ma come ho bisogno di mantenere i dati risultanti più piccolo possibile questa non è un'opzione - voglio solo per memorizzare e caricare i dati, non il javascript codice per i metodi.
Inoltre, non desidero dovere inserire i dati caricati da JSON come oggetto secondario se posso aiutarlo (ma potrebbe essere l'unico modo), ad es.
function Person(name) {
this.data = {};
this.data.name=name;
}
var newPerson = new Person("");
newPerson.data = eval("(" + aPersonJSON + ")");
alert (newPerson.data.name); // Bob
Qualche idea?
Utilizzare ['JSON.parse'] (http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/) e non' eval' per analizzare JSON. Se i browser di destinazione non supportano 'JSON.parse' (cioè IE7 o precedente), uno shim via' json.js' di Crockford (che usa internamente eval', ma fornisce anche validazione di sanità) o 'json2. js' è prontamente disponibile. –
Ciao, Il problema non è eval o parse, che producono entrambi lo stesso oggetto non tipizzato, sto cercando di trovare un modo per far entrare il JSON nella Fuction della Person. Qualche idea su questo? –
@JohnLittle non usa mai eval !, è una fonte di molti problemi di sicurezza (iniezione di codice, ecc.) [Leggi questo] (http://stackoverflow.com/questions/197769/when-is-javascripts-eval-not-evil) – thepoosh