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
),因为当您将相同的json反序列化回Field
而不使用POJO
属性时,它会混淆要创建哪个实例、className
、Field
或子字段1
子字段2
- 为了方便起见,我在
中使用了公共属性。您应该更喜欢只使用setter/getter的私有字段POJO