java - 具有 jackson 序列化/反序列化的多级多态树

标签 java json inheritance serialization jackson

是否可以使用jackson对复杂的继承结构进行序列化和反序列化?它的注释是什么?例如,如果我有以下类(class)

@Inheritance
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type")
@JsonSubTypes({
     @Type(value = Dog.class,name = "dog")
     @Type(value = Cat.class,name = "cat")
})

public class Animal implements Serializable{

@id
long id;

String name;

}

这当然是父类。如果猫和狗没有任何继承类,我知道这是正确的。如果我想要狗的子类,我需要在动物类和狗类中更改什么?

这里是第二类,仅供引用

@JsonTypeName("dog")
public class Dog extends Animal implements Serializable{
    //all my props etc here
{

我如何创建一个从动物和狗继承的猎犬类和约克类,我可以将它们传递给其中任何一个,并且让 jackson 不会对我感到害怕。

最佳答案

多级多态树对于Jackson来说应该不是问题。这是序列化/反序列化类层次结构的示例,类似于您问题中的 the Jackson wiki page. 中的内容。

public class JacksonPolymorphism3 {

    @JsonTypeInfo(
            use = JsonTypeInfo.Id.NAME,
            include = JsonTypeInfo.As.PROPERTY,
            property = "type")
    public abstract static class Animal {
        public final String animalField;

        @JsonCreator
        public Animal(@JsonProperty("animalField") String animalField) {
            this.animalField = animalField;
        }
    }

    @JsonTypeName("dog")
    public static class Dog extends Animal {
        public final String dogField;

        public Dog(@JsonProperty("animalField") String animalField,
                   @JsonProperty("dogField") String dogField) {
            super(animalField);
            this.dogField = dogField;
        }

        @Override
        public String toString() {
            return "Dog{" +
                    "dogField='" + dogField + '\'' +
                    '}';
        }
    }

    @JsonTypeName("husky")
    public static class Husky extends Dog {
       public final String huskyField;

        public Husky(@JsonProperty("animalField") String animalField,
                     @JsonProperty("dogField") String dogField,
                     @JsonProperty("huskyField") String huskyField) {
            super(animalField, dogField);
            this.huskyField = huskyField;
        }

        @Override
        public String toString() {
            return "Husky{" +
                    "huskyField='" + huskyField + '\'' +
                    '}';
        }
    }

    public static void main(String[] args) throws IOException {
        List<Dog> dogs;
        dogs = Arrays.asList(new Dog("aField", "dogField"), new Husky("hField", "dField2", "hField"));

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerSubtypes(Dog.class, Husky.class);
        TypeReference<List<Dog>> referenceType = new TypeReference<List<Dog>>() {
        };
        String json = mapper.writerWithDefaultPrettyPrinter().withType(referenceType).writeValueAsString(dogs);
        System.out.println(json);
        System.out.println(mapper.readValue(json, referenceType));
    }
}

输出:

[ {
  "type" : "dog",
  "animalField" : "aField",
  "dogField" : "dogField"
}, {
  "type" : "husky",
  "animalField" : "hField",
  "dogField" : "dField2",
  "huskyField" : "hField"
} ]
[Dog{dogField='dogField'}, Husky{huskyField='hField'}]

如果没有帮助,请提供更多代码。

关于java - 具有 jackson 序列化/反序列化的多级多态树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23795230/

相关文章:

java - Spring 请求映射与正则表达式如 javax.ws.rs

java - 设置图形对象的工具提示文本

java - 无法让 BufferedWriter 写出文件中的所有数据

json - 如何在 node.js + Express 中同时支持 json 和 jsonp 响应?

javascript - 使用socket io发送和获取数据的两条指令

javascript - 如何通过远程json在客户端发送 "configure"javascript?

python - dict value 和 items 使用什么内部函数,以及如何覆盖它们?

javascript - 使用 Object.create 创建的对象会继承原型(prototype)吗?

java - 在 main 方法的类中扩展 Frame 类

Java 方法未运行