[Javascript] Dojo: come caricare un oggetto (contenente altri oggetti) da JSON?


Answers

JSON non è la stessa cosa di un oggetto JavaScript, infatti, è solo un sottoinsieme. JSON consente solo matrici, oggetti e, naturalmente, tipi di base come stringhe, booleani, numeri e null . Puoi trovare l'intera specifica qui .

Se vuoi davvero mantenere le funzioni puoi usare la eval() , ma questo non è veramente raccomandato, perché effettivamente analizza quelle funzioni. Se il contenuto valutato contiene input dannosi, anche questo viene eseguito.

Per esempio:

eval("myObj = { getSum: function getSum(a, b) { return a + b; } }");
myObj.getSum(1, 2); // Returns 3

È meglio tentare di salvare lo stato dell'oggetto ( name e url ad esempio) e ricostruirlo una volta che lo si analizza di nuovo, questo è ciò che accade anche in altri linguaggi di programmazione. Ad esempio, se stai serializzando / deserializzando un oggetto in Java.

Question

Ho un modello a oggetti che voglio poter salvare. Lo esporterò in JSON e poi lo leggerò come JSON.

Salvare su JSON è facile. Basta usare questo: JSON.stringify(this) .

Il caricamento da JSON non è così semplice.

  • Non possiamo semplicemente usare this = JSON.parse(someJson) perché i metodi non saranno allegati.
  • Usando qualcosa come lang.mixin(this, JSON.parse(someJson)) otterrà le funzioni ma gli oggetti che sono

Classe fotografica:

define([...], function(...){
    return declare(null, {
        name: ..., // String
        url:..., // String
        complexProperty:..., // Some other class

        someFunction1: function(...){..},
        someFunction2: function(...){..},
        someFunction2: function(...){..}
    }
));

Classe Album di foto:

define([...], function(...){
    return declare(null, {
        photos: [], /* Array of type Photo (see above) */
        someOtherProperty: ...,
        someOtherProperty: ...,

        someFunction1: function(...){..},
        someFunction2: function(...){..},
        someFunction2: function(...){..},

        toJson: function(){
            return JSON.stringify(this);    // From dojo/json
        }

        loadFromJson: function(jsonIn){
            // How to do this?
        }, 

        /* This doesn't work because methods will be overridden */
        loadFromJson1: function(jsonIn){
            this = JSON.parse(someJson);
        }, 

        /* This insures that my methods are kept intact but my childrens methods arn't (ie: the array of photos) */
        loadFromJson2: function(jsonIn){
            lang.mixin(this, JSON.parse(someJson));
        }, 

        /* This seems like an aweful lot of work.  Any better ways to do this? */
        loadFromJson3: function(jsonIn){
            this.someOtherProperty = jsonIn.someOtherProperty;
            this.someOtherProperty = jsonIn.someOtherProperty;
            foreach(jsonIn.photos: photoJson){
                var newPhoto = new Photo();
                newPhoto.loadfromJson(photoJson);
                this.photos.add(newPhoto);
            }
            ... All other properties set recursively.  All things in model now need this method ...
        }
    }
));