为了序列化,我想知道是否有一个用于将类型化对象转换为普通json并返回的库。
天真的解决方案就像:
function Person( name, sex, age ) {
this.name = name;
this.sex = sex;
this.age = age;
}
Person.prototype.serialize = function () {
var obj = this;
return '{ ' + Object.getOwnPropertyNames( this ).map( function ( key ) {
var value = obj[key];
if ( typeof value === 'string' ) { value = '"' + value + '"'; }
return '"' + key + '": ' + value;
}).join( ', ' ) + ' }';
};
Person.deserialize = function ( input ) {
var obj = JSON.parse( input );
return new Person( obj.name, obj.sex, obj.age );
};
(来自:Javascript Serialization of Typed Objects)
是否有嵌套类型的简单解决方案?
编辑:
假设我有一组模型(如骨干模型): 用户,任务等 每个模型都支持toJson和fromJson函数。 toJson返回具有模型属性的普通对象。 fromJson获取一个普通对象并创建一个新的模型对象。
我正在寻找可以恢复类型的解决方案。例如,通过使用原始类型的名称保存“_prototype”属性。
编辑:
我刚发现:https://stackoverflow.com/a/14028886/1163440 这就是我的想法..但我正在寻找嵌套类型
答案 0 :(得分:2)
您可以将JSON.stringify与 replacer 一起使用,将JSON.parse与 reviver 一起使用,如下所示:
function Person (name) {
this.name = name;
}
var p = new Person('haaa');
p.children = [new Person('haaa jr')]
var str = JSON.stringify(p, function replacer (key, value) {
//warning this change the object. maybe use $.extend or xtend, or a deep clone library
value.__type = value.constructor.name
return value;
});
var parsed = JSON.parse(str, function reviver (key, value) {
if (value.__type === 'Person') {
var p = new Person(value.name);
Object.getOwnPropertyNames(value).forEach(function (k) {
p[k] = value[k];
});
return p;
}
return value;
});
console.log('is children a Person?', parsed.children[0] instanceof Person);
序列化对象将如下所示:
{
"name": "haaa",
"children": [
{
"name": "haaa jr",
"__type": "Person"
}
],
"__type": "Person"
}
Replacer和reviver是非常强大的扩展点。