如何使用Jackson在运行时反序列化通用对象

时间:2014-07-15 22:35:24

标签: java json serialization jackson

假设我有以下java类(为了简洁省略了getters& setters)。

public class AllMyEvents {
    private List<SomeEvent<?>> eventList;
}

public class SomeEvent<T> {
    private long time;

    @JsonProperty("event_type")
    private String eventType;

    @JsonProperty("event_data")
    private T eventData;    
}

public class BigEvent {
    private List<SomeEvent<LittleEvent>> subEvents;
}

public class LittleEvent {
    private long data;
}

我打电话的时候:

ObjectMapper om = new ObjectMapper();
AllMyEvents events = om.readValue(IOUtils.toString(jsonData, "UTF-8"),AllMyEvents.class);

字段eventData的类型为LinkedHashMap。我想要的是这个字段类型由eventType字符串指定。如果字符串为'big',我希望eventData包含BigEventLittleEvent,如果字符串为'little'

是否可以使用Jackson注释执行此操作,还是需要编写自定义序列化器/反序列化器或其他方法?如果相关,我正在使用Jackson 1.9。

1 个答案:

答案 0 :(得分:0)

Json Sub类型是你的答案。

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="@class")
    @JsonSubTypes({
              @JsonSubTypes.Type(value=BigEvent.class, name="big"),
              @JsonSubTypes.Type(value=LittleEvent.class, name="little")
        })
public class SomeEvent<T> {
    private long time;

    @JsonProperty("event_type")
    private String eventType;

    ...

另见:http://wiki.fasterxml.com/JacksonPolymorphicDeserialization