杰克逊:@JsonTypeId在嵌套时没有正确序列化

时间:2016-11-24 06:23:00

标签: jackson

我有一个Zoo类,它可以包含不同类型的动物(Dog,...),并且有一个用@JsonTypeId注释的animalType。 Dog类又可以包含不同类型的皮带(RopeLeash,...),并且使用@JsonTypeId注释leashType。当我使用下面的方法序列化Zoo类时,leshType也为animalType设置:

String zooJson = objectMapper.writeValueAsString(zoo);

输出是:

{"animal":{"leash":{"leashColor":"RED"},"leashType":"ROPE"},"animalType":"ROPE"}

类:

public class Zoo {
    @JsonTypeId
    private AnimalType animalType;
    private Animal animal; 

    @JsonTypeInfo(
            use = JsonTypeInfo.Id.NAME, 
            include = JsonTypeInfo.As.EXTERNAL_PROPERTY, 
            property = "animalType"
            )
    @JsonSubTypes({ 
        @JsonSubTypes.Type(value = Cat.class, name = "CAT"),                
        @JsonSubTypes.Type(value = Dog.class, name = "DOG")                
        })
    public void setAnimal(Animal animal) {
        this.animal = animal;
    }
   //Other getters and setters
}

public class Dog extends Animal {
    @JsonTypeId
    private LeashType leashType;
    private Leash leash;
    @JsonTypeInfo(
            use = JsonTypeInfo.Id.NAME, 
            include = JsonTypeInfo.As.EXTERNAL_PROPERTY, 
            property = "leashType"
            )
    @JsonSubTypes({ 
        @JsonSubTypes.Type(value = RopeLeash.class, name = "ROPE")                
        })
    public void setLeash(Leash leash) {
        this.leash = leash;
    }
   //Other getters and setters
}

public class RopeLeash extends Leash {
    private String leashColor;
    //Getter and setter for leashColor
}

我的注释用法有问题吗?

1 个答案:

答案 0 :(得分:0)

杰克逊似乎不支持多级ID。在杰克逊网站上发布了这个问题,这是回复:

  

不支持多级类型ID;需要一个id。没有   计划使用多级支持。

链接:https://github.com/FasterXML/jackson-databind/issues/1462