Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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_Polymorphism - Fatal编程技术网

在Javascript中反序列化多态JSON

在Javascript中反序列化多态JSON,javascript,json,polymorphism,Javascript,Json,Polymorphism,我的客户端代码从服务器获取一个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?

我的客户端代码从服务器获取一个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对象而不显式复制每个属性,或者将解析后的对象转换为其他类型

我读了一些关于
\uuuu proto\uuuuu
的书,但我觉得这是一个大锤子,它应该是一个小坚果


我看到过关于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);
}   

如果您给出了一个更好的正确类型的示例,以及一些示例数据,我可以提供一个更好的答案。

您没有指定要实现的模式(如果有的话),但正如另一个答案所提到的,您必须在对象的构造过程中采用某种约定。不过,您不必明确说明每种类型。。。如果您对JSON数据的完整性感到满意,那么您可能会有点懒散地将JSON数据与合并

我还将包含一个帮助函数,用于解析给定范围内的“类型”——通常在项目中为对象命名名称空间,以避免污染全局范围。例如:

函数名称空间(str,作用域){
范围=范围| |窗口;
var parts=str.split('.');
while(零件长度)
范围=范围[parts.shift()];
返回范围;
}
Foo={};
Foo.Bar=函数(conf){
//某种构造器
$.extend(这个,conf);
};
//测试。。。
var json={
键入:“Foo.Bar”,
var1:1,
var2:2,
var3:3
};
var obj=new(名称空间(json.type))(json);
日志(obj,Foo.Bar的obj实例);
。。。或与您自己的代码相匹配:

$.getJSON(“foo.json”).done(函数(数据、文本状态、xhr){
data.objects=$.map(data.objects,函数(obj){
返回new(名称空间(obj.type))(obj);
});
});   

你的答案正是我需要做的-但我想避免在A和B构造函数中的所有显式赋值。我明白了,所以我想如果你将我写的东西与一些
.extend
$.extend
合并。你得到你想要的。通常情况下,如果我处理这样的数据,我会尽量显式,因为最终可能会添加对数据进行读/写的方法。如果你不这样做,它会感觉非常脆弱:/,如果你想这样做,为什么不把它作为一个对象来保存呢。
$。extend
正是我想要的!