Javascript 将JSON反序列化为包含其他类的类
我看过很多关于如何将JSON反序列化到类的文章,例如Object.assignnew class、JSON.parsejson,但我想知道,如果JSON中有嵌套的类和类名参数,是否有一种很好的反序列化JSON的方法 我可以吃一些像:Javascript 将JSON反序列化为包含其他类的类,javascript,json,Javascript,Json,我看过很多关于如何将JSON反序列化到类的文章,例如Object.assignnew class、JSON.parsejson,但我想知道,如果JSON中有嵌套的类和类名参数,是否有一种很好的反序列化JSON的方法 我可以吃一些像: { class_name: "MyClass", x: 1, p: { class_name: "OtherClass", y: 2 } } 课程及类别: clas
{
class_name: "MyClass",
x: 1,
p: {
class_name: "OtherClass",
y: 2
}
}
课程及类别:
class MyClass {
constructor(x, p) {
this.x = x;
this.p = p;
}
}
class OtherClass {
constructor(y) {
this.y = y;
}
}
我需要做的是以这样的方式解析这个JSON,我得到MyClass对象,它的p值将是OtherClass对象,我想使用class_name参数来实现这一点。我知道这一定是可能的,但是有没有一个简单的方法可以做到这一点呢?JSON.parse有一个可选的方法,可以用来初始化和注入类。
这是一个简单的例子:
var a = `
{
"class_name": "MyClass",
"x": 1,
"p": {
"class_name": "OtherClass",
"y": 2
}
}`
class MyClass {
constructor(x, p) {
this.x = x;
this.p = p;
}
}
class OtherClass {
constructor(y) {
this.y = y;
}
}
const classRegistry = {
MyClass,
OtherClass
}
function reviver(_, value) {
if(value instanceof Object && Object.prototype.hasOwnProperty.call(value, 'class_name')) {
clazz = classRegistry[value.class_name];
if(clazz) {
let {class_name:_, ...valueWithoutClassName} = value;
return Object.assign(new clazz, valueWithoutClassName)
}
}
return value;
}
console.log(JSON.parse(a, reviver));
输出:
MyClass { x: 1, p: OtherClass { y: 2 } }
classRegistry列出允许的类,并将它们映射到类构造函数。
JSON.parse为每个属性调用函数reviver,它检查属性值是否有class_name,如果有:
它检查class_name是否具有允许的值。
创建不带class_name属性的值的副本。
创建指定类的实例,并填充它。