在Javascript中反序列化多态JSON

我的客户端代码从服务器获取JSON“对象”,然后解析它.解析的对象包含一个’type’属性,该属性应该控制对象的类.

$.getJSON("foo.json").done(function(data, textStatus, xhr) {
    $.each(data.objects, function(key, val)
    {
      if (val.type = "A") // make val into an object of class A, somehow?
        ...
      else if (val.type = "B") // make val into an object of class B somehow?
        ... etc...
    }
}    

如何在不显式复制每个属性的情况下创建正确类型的JavaScript对象,或者 – 将解析后的对象转换为其他类型?

我已经阅读了一些关于__proto__的内容,但感觉这对于应该是一个小小的坚果来说是一个很大的大锤……

我见过类似的关于Java和Jackson的问题,但Javascript没有…

解决方法:

你可以做这样的事情

function ObjectFactory() {
    this.newInstance = function(val) {
      if (val.type == "A") return new A(val);
      if (val.type == "B") return new B(val);
    }
}    
function A(data) {
    // do something with the data
    this.property = data.property;
}

function B(data) {
    // do something with the data
    this.property = data.property;
    this.bSpecificProperty = data.bSpecificProperty;
}

$.getJSON("foo.json").done(function(data, textStatus, xhr) {
    var objectFactory = new ObjectFactory();
    var objects = $.map(data.objects, objectFactory.newInstance);

    console.log(objects);
}   

如果你给出了一个更好的例子,说明了正确的类型,以及一些样本数据,我可以提供更好的答案.

上一篇:在Java中如何引用子类变量而不在父类中声明该变量?


下一篇:获取作为基类传递的派生C#类的属性到泛型方法