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

Javascript 如何序列化/反序列化Typescript中的复杂对象,例如反序列化的对象与序列化的对象的类型相同,javascript,json,typescript,stringify,jsonparser,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.pars

我有一个复杂的对象,我想序列化和反序列化,并获得相同类型的对象

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}`);
控制台输出为:


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

您可以使用对象的
fromJSON()
以及
reviver
函数来
JSON.parse()

例如:

type Serialized=Pick&{u type:string};
类工作流{
foo:数字;
构造函数(foo:number){
this.foo=foo;
}
public-toJSON():已序列化{
返回{
_类型:this.constructor.name,
这
};
}
公共静态fromJSON(源代码:序列化):工作流{
返回新工作流(source.foo);
}
}
函数恢复器(键:字符串,值:任意):任意{
if(值的类型===“对象”&&value&&&u值中的类型){
开关(数值型){
案例“工作流”:返回Workflow.fromJSON(值);
}
}
返回值;
}
const w=新工作流(42);
console.log(带工作流实例);
const s=JSON.stringify(w);
控制台日志;
const w2=JSON.parse(s,reviver)作为工作流;
console.log(w2.foo);
console.log(w2工作流实例);
印刷品:

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

你自己去试试吧

您可以使用对象的
fromJSON()
还原程序
函数来
JSON.parse()
实现您想要的功能

例如:

type Serialized=Pick&{u type:string};
类工作流{
foo:数字;
构造函数(foo:number){
this.foo=foo;
}
public-toJSON():已序列化{
返回{
_类型:this.constructor.name,
这
};
}
公共静态fromJSON(源代码:序列化):工作流{
返回新工作流(source.foo);
}
}
函数恢复器(键:字符串,值:任意):任意{
if(值的类型===“对象”&&value&&&u值中的类型){
开关(数值型){
案例“工作流”:返回Workflow.fromJSON(值);
}
}
返回值;
}
const w=新工作流(42);
console.log(带工作流实例);
const s=JSON.stringify(w);
控制台日志;
const w2=JSON.parse(s,reviver)作为工作流;
console.log(w2.foo);
console.log(w2工作流实例);
印刷品:

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

你自己去试试吧

Object.assign(新工作流,工作流3)
是的,这是我不在JS中使用类(用于必须存储在某处的东西)的原因之一。这很有效,我尝试过,谢谢你的帮助。
Object.assign(新工作流,工作流3)
是的,这是我不在JS中使用类的原因之一(用于必须存放在某处的物品)。这有效,我尝试过,感谢您的帮助。此答案很好,我将其标记为已接受。但是,在收到此答案之前,我从此处实施了选项4:。此答案很好,我将其标记为已接受。但是,在收到此答案之前,我从此处实施了选项4:。