Dojo:如何从JSON加载对象(包含其他对象)?

时间:2014-04-08 18:58:01

标签: javascript json serialization dojo deserialization

我有一个我希望能够保存的对象模型。我将把它导出到JSON,然后以JSON的形式读回来。

保存到JSON很简单。只需使用:JSON.stringify(this)

从JSON加载并不那么简单。

  • 我们不能只使用this = JSON.parse(someJson),因为这些方法不会被附加。
  • 使用lang.mixin(this, JSON.parse(someJson))之类的内容将获得
  • 对象的功能

照片类:

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

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

相册类:

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 ...
        }
    }
));

2 个答案:

答案 0 :(得分:3)

我认为你最好还是返回一个JSON对象,它只包含你需要序列化的数据,而不是整个类。然后你的loadFromJson方法将更容易实现,并且你不会通过网络发送不必要的数据。示例toJson():

toJson: function() {
    return JSON.stringify({
        photos: this.photos,
        someImportantProp: this.someImportantProp,
        anotherProp: this.anotherProp
    });
}

答案 1 :(得分:1)

JSON与JavaScript对象不同,事实上,它只是一个子集。 JSON只允许数组,对象,当然还有基本类型,如字符串,布尔值,数字和null。您可以找到整个规范here

如果你真的想保留这些功能,你可以使用eval()函数,但这并不是真的推荐,因为它确实解析了这些函数。如果评估的内容包含恶意输入,那么也正在执行。

例如:

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

你可以更好地尝试保存对象的状态(例如nameurl),并在再次解析它时重建它,这就是发生在其他编程语言也是如此。例如,如果您在Java中序列化/反序列化对象。