我想将一个复杂的对象树保存为字符串,可以在浏览器或nodejs中工作。最明显的事情是使用JSON.stringify和JSON.parse - 但是我只是获取字符串和数字的值,依此类推,但是没有存储什么类型的对象,因此无法恢复。或者更确切地说,值是恢复但不是函数绑定。在JavaScript中使用方法函数执行持久化对象的正确方法是什么?
答案 0 :(得分:1)
如果你的函数通常是操作/转换的静态方法,你应该只能从JSON数据重新初始化类。
也许你应该创建一个exportToJson
函数和importFromJson
函数,例如
function SomeClass(json) {
var base = this;
base.a = 'asdf';
base.b = 'fdsa';
base.export = function () {
return JSON.stringify({
a: base.a,
b: base.b
});
};
base.imports = function (js) {
base.a = js['a'];
base.b = js['b'];
};
if (typeof json !== 'undefined') {
base.imports(json);
}
}
(不是最优雅的解决方案,但这也是StackOverflow:p)
答案 1 :(得分:1)
您已经可以使用JSON.stringify()
和JSON.parse()
完成所需的操作。
JSON.stringify()
检查传递给它的对象的.toJSON()
方法。因此,如果您的对象/类/无论实现该方法,您都可以返回所需的任何序列化格式。这可以包括对象/类类型以及稍后对其进行反序列化所需的其他信息。
JSON.parse()
有reviver function parameter,允许您手动返回每个已解析的JSON值的反序列化值。
例如,在.toJSON()
中,您可能会返回一个包含数据的对象,但也会返回一个设置为对象类型名称的__objType
属性。然后在你的reviver函数中,检查值是否为对象,以及它是否具有__objType
属性。如果是,则检查该属性的值并对其进行适当的反序列化(您甚至可以在对象/类中编写.fromJSON()
来为您执行此操作,但与.toJSON()
不同,{{1}没有特别的意义)。