Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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
Java 在jackson中已配置原始超类型后动态添加新的子类型_Java_Inheritance_Jackson_Jackson Databind - Fatal编程技术网

Java 在jackson中已配置原始超类型后动态添加新的子类型

Java 在jackson中已配置原始超类型后动态添加新的子类型,java,inheritance,jackson,jackson-databind,Java,Inheritance,Jackson,Jackson Databind,我有一个超类字段,还有两个其他类继承了超类字段 我想动态添加子类而不影响超类的更改 public class TestConfiguration { private List<Field> fields; } 当字段是子类ExtendedHierarchicalField的实例时,我希望以这种方式使用映射,然后使用用于映射的className属性“ExtendedHierarchicalField”或用于映射对象的任何其他方式 { "fields

我有一个超类
字段
,还有两个其他类继承了超类
字段

我想动态添加子类而不影响超类的更改

public class TestConfiguration {

private List<Field> fields;


}
当字段是子类ExtendedHierarchicalField的实例时,我希望以这种方式使用映射,然后使用用于映射的className属性“ExtendedHierarchicalField”或用于映射对象的任何其他方式

{
          "fields" : [ {
            "className" : "ExtendedHierarchicalField",
            "name" : "First_name",
            "type" : {
              "fieldType" : {
                "name" : "string"
              }
            },
            "required" : true
          }]
}

您可以使用jackson注释实现同样的效果。
将您的类定义为:
Field.java

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, property = "className")
@JsonSubTypes({
                      @JsonSubTypes.Type(value = SubField1.class),
                      @JsonSubTypes.Type(value = SubField2.class)
              })
public class Field {
    public String name;
}
public class SubField1 extends Field {
    public String subField1Property = "subField1Property value";
}
public class SubField2 extends Field {
    public String subField2Property = "subField2Property value";
}
public class TestConfiguration {
    public List<Field> fields;
}
子字段1.java

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, property = "className")
@JsonSubTypes({
                      @JsonSubTypes.Type(value = SubField1.class),
                      @JsonSubTypes.Type(value = SubField2.class)
              })
public class Field {
    public String name;
}
public class SubField1 extends Field {
    public String subField1Property = "subField1Property value";
}
public class SubField2 extends Field {
    public String subField2Property = "subField2Property value";
}
public class TestConfiguration {
    public List<Field> fields;
}
子字段2.java

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, property = "className")
@JsonSubTypes({
                      @JsonSubTypes.Type(value = SubField1.class),
                      @JsonSubTypes.Type(value = SubField2.class)
              })
public class Field {
    public String name;
}
public class SubField1 extends Field {
    public String subField1Property = "subField1Property value";
}
public class SubField2 extends Field {
    public String subField2Property = "subField2Property value";
}
public class TestConfiguration {
    public List<Field> fields;
}
TestConfiguration.java

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, property = "className")
@JsonSubTypes({
                      @JsonSubTypes.Type(value = SubField1.class),
                      @JsonSubTypes.Type(value = SubField2.class)
              })
public class Field {
    public String name;
}
public class SubField1 extends Field {
    public String subField1Property = "subField1Property value";
}
public class SubField2 extends Field {
    public String subField2Property = "subField2Property value";
}
public class TestConfiguration {
    public List<Field> fields;
}
输出:

{
  "fields" : [ {
    "className" : ".Field",
    "name" : "main field"
  }, {
    "className" : ".SubField1",
    "name" : "sub field 1",
    "subField1Property" : "subField1Property value"
  }, {
    "className" : ".SubField2",
    "name" : "sub field 2",
    "subField2Property" : "subField2Property value"
  } ]
}
注意:

{
  "fields" : [ {
    "className" : ".Field",
    "name" : "main field"
  }, {
    "className" : ".SubField1",
    "name" : "sub field 1",
    "subField1Property" : "subField1Property value"
  }, {
    "className" : ".SubField2",
    "name" : "sub field 2",
    "subField2Property" : "subField2Property value"
  } ]
}
  • className
    属性是强制性的(即使对于顶级类
    Field
    ),因为当您将相同的json反序列化回
    POJO
    而不使用
    className
    属性时,它会混淆要创建哪个实例、
    Field
    子字段1
    子字段2
  • 为了方便起见,我在
    POJO
    中使用了公共属性。您应该更喜欢只使用setter/getter的私有字段