我应该如何在javascript中将复杂对象保存为字符串

时间:2014-12-21 14:38:52

标签: javascript json node.js object-persistence

我想将一个复杂的对象树保存为字符串,可以在浏览器或nodejs中工作。最明显的事情是使用JSON.stringify和JSON.parse - 但是我只是获取字符串和数字的值,依此类推,但是没有存储什么类型的对象,因此无法恢复。或者更确切地说,值是恢复但不是函数绑定。在JavaScript中使用方法函数执行持久化对象的正确方法是什么?

2 个答案:

答案 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}没有特别的意义)。