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

How should I persist complex objects as strings in javascript

本文关键字:对象 字符串 保存 复杂 javascript 我应该      更新时间:2023-09-26

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

你已经可以用JSON.stringify()JSON.parse()做你想做的事了。

JSON.stringify()检查传递给它的对象的 .toJSON() 方法。因此,如果你的对象/类/任何东西实现了该方法,你可以返回你想要的任何序列化格式。这可以包括对象/类类型以及稍后反序列化它所需的其他信息。

JSON.parse()有一个齐磊函数参数,允许您为每个解析的 JSON 值手动返回未序列化的值。

例如,在.toJSON()中,您可能会返回一个包含数据的对象,但也返回一个设置为对象类型名称的 __objType 属性。然后在齐磊函数中,检查值是否是一个对象,以及它是否具有__objType属性。如果是这样,那么您可以检查该属性的值并适当地反序列化它(您甚至可以在对象/类中编写一个 .fromJSON() 为您执行此操作,但与 .toJSON() 不同,.fromJSON()没有特殊含义(。

如果您的函数通常是用于 manip/转换的静态方法,您应该能够从 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(