我有一个我希望能够保存的对象模型。我将把它导出到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 ...
}
}
));
答案 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
你可以更好地尝试保存对象的状态(例如name
和url
),并在再次解析它时重建它,这就是发生在其他编程语言也是如此。例如,如果您在Java中序列化/反序列化对象。