Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将JSON反序列化为包含其他类的类_Javascript_Json - Fatal编程技术网

Javascript 将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

我看过很多关于如何将JSON反序列化到类的文章,例如Object.assignnew class、JSON.parsejson,但我想知道,如果JSON中有嵌套的类和类名参数,是否有一种很好的反序列化JSON的方法

我可以吃一些像:

{
    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属性的值的副本。 创建指定类的实例,并填充它。