所有这些都可以通过注释来完成。
使用“ metadata”和“ owner”等通用字段及其获取器/设置器创建一个抽象超类。此类需要使用@JsonTypeInfo进行注释。它应该看起来像:
@JsonTypeInfo(use = Id.CLASS, include = As.PROPERTY, property = "type")
使用该参数,property = “type”您可以指定将类别标识符序列化为JSON文档中的字段类型。
可以使用来指定类标识符的值use。Id.CLASS使用标准的Java类名称。您也可以使用Id.MINIMAL_CLASS缩写Java类名。要使用自己的标识符,请使用Id.NAME。在这种情况下,您需要声明子类型:
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")@JsonSubTypes({ @JsonSubTypes.Type(value = Foo.class, name = "Foo"), @JsonSubTypes.Type(value = Bar.class, name = "Bar")})通过扩展抽象超类来实现Foo和Bar类。
Jackson的ObjectMapper将使用JSON文档的其他字段“类型”进行序列化和反序列化。例如 当您将JSON字符串反序列化为超类引用时,它将属于适当的子类:
ObjectMapper om = new ObjectMapper();Abstractbase x = om.readValue(json, Abstractbase.class);// x will be instanceof Foo or Bar
完整的代码示例(我使用公共字段作为无需编写getter / setter的快捷方式):
package test;import com.fasterxml.jackson.annotation.JsonTypeInfo;import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.annotation.JsonTypeInfo.As;import java.io.IOException;import com.fasterxml.jackson.annotation.JsonSubTypes;@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")@JsonSubTypes({ @JsonSubTypes.Type(value = Foo.class, name = "Foo"), @JsonSubTypes.Type(value = Bar.class, name = "Bar")})public abstract class Abstractbase { public metaData metaData; public Owner owner; @Override public String toString() { return "metaData=" + metaData + "; owner=" + owner; } public static void main(String[] args) throws IOException { // Common fields Owner owner = new Owner(); owner.name = "Richard"; metaData metaData = new metaData(); metaData.data = "Some data"; // Foo Foo foo = new Foo(); foo.owner = owner; foo.metaData = metaData; CustomObject customObject = new CustomObject(); customObject.id = 20l; customObject.fizz = "Example"; Data data = new Data(); data.object = customObject; foo.data = data; System.out.println("Foo: " + foo); // Bar Bar bar = new Bar(); bar.owner = owner; bar.metaData = metaData; bar.data = "A String in Bar"; ObjectMapper om = new ObjectMapper(); // Test Foo: String foojson = om.writevalueAsString(foo); System.out.println(foojson); Abstractbase fooDeserialised = om.readValue(foojson, Abstractbase.class); System.out.println(fooDeserialised); // Test Bar: String barjson = om.writevalueAsString(bar); System.out.println(barjson); Abstractbase barDeserialised = om.readValue(barjson, Abstractbase.class); System.out.println(barDeserialised); }}class Foo extends Abstractbase { public Data data; @Override public String toString() { return "Foo[" + super.toString() + "; data=" + data + ']'; }}class Bar extends Abstractbase { public String data; public String toString() { return "Bar[" + super.toString() + "; data=" + data + ']'; }}class Data { public CustomObject object; @Override public String toString() { return "Data[object=" + object + ']'; }}class CustomObject { public long id; public String fizz; @Override public String toString() { return "CustomObject[id=" + id + "; fizz=" + fizz + ']'; }}class metaData { public String data; @Override public String toString() { return "metaData[data=" + data + ']'; }}class Owner { public String name; @Override public String toString() { return "Owner[name=" + name + ']'; }}


