javascript - 如何在 Typescript 中序列化/反序列化复杂对象,例如反序列化对象与序列化对象的类型相同

标签 javascript json typescript stringify jsonparser

我有一个复杂的对象,我想对其进行序列化和反序列化并获取相同类型的对象。

let workflow = new Workflow();
console.log(`workflow is instanceof Workflow: ${workflow instanceof Workflow}`);
console.log(workflow);

let json = JSON.stringify(workflow);
console.log(json);

let workflow2 = JSON.parse(json) as Workflow;
console.log(workflow2);
console.log(`workflow2 is instanceof Workflow: ${workflow2 instanceof Workflow}`);

let workflow3: Workflow = JSON.parse(json) as Workflow;
console.log(workflow3);
console.log(`workflow3 is instanceof Workflow: ${workflow3 instanceof Workflow}`);

控制台输出为:

enter image description here

是否有现成的解决方案,或者我需要手动重新实例化复杂对象并设置其所有属性?

最佳答案

您可以将对象的 fromJSON()reviver 函数一起使用到 JSON.parse() 来实现您想要的效果。

例如:

type Serialized<T> = Pick<T, keyof T> & { _type: string };

class Workflow {
  foo: number;

  constructor(foo: number) {
    this.foo = foo;
  }

  public toJSON(): Serialized<Workflow> {
    return {
      _type: this.constructor.name,
      ...this
    };
  }

  public static fromJSON(source: Serialized<Workflow>): Workflow {
    return new Workflow(source.foo);
  }
}

function reviver(key: string, value: any): any {
  if (typeof value === "object" && value && "_type" in value) {
    switch (value._type) {
      case "Workflow": return Workflow.fromJSON(value);
    }
  }
  return value;
}

const w = new Workflow(42);
console.log(w instanceof Workflow);

const s = JSON.stringify(w);
console.log(s);

const w2 = JSON.parse(s, reviver) as Workflow;
console.log(w2.foo);
console.log(w2 instanceof Workflow);

打印:

true
{"_type":"Workflow","foo":42}
42
true

亲自尝试一下 playground !

关于javascript - 如何在 Typescript 中序列化/反序列化复杂对象,例如反序列化对象与序列化对象的类型相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57333334/

相关文章:

javascript - 我们可以在可观察流上使用高通滤波器来检测震动事件吗?

c# - 哪个 Json 反序列化器呈现 IList<T> 集合?

javascript - Extjs 选项卡菜单从 Ajax 加载完整内容

java - Jackson 通用 json 到 List<T> 转换器方法不起作用

reactjs - 如何使用样式组件扩展(MUI)React 组件的 TS 接口(interface)?

javascript - ReactJS-图像src调用另一个文件夹错误

javascript - 仅在完全创建时显示工具提示

javascript - 单击扩展图标时打开 popup.html

angular - 如何从 Angular 中的服务方法访问属性?

javascript - 如何检索 OpenAI 图像并将其保存到 S3 存储桶