简体   繁体   中英

How to deserialize a generic object at runtime with Jackson

Say I have the following java classes (getters & setters omitted for brevity).

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;
}

When I call:

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

The field eventData is of type LinkedHashMap . What I want is for this fields type to be specified by the eventType string. If the string is 'big' I want eventData to have type BigEvent or LittleEvent if the string is 'little' .

Is it possible to do this with Jackson annotations, or will I need to write a custom serializer/deserializer, or some other method? I'm using Jackson 1.9 if that is relevant.

Json Sub types is your answer.

@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;

    ...

Also see: http://wiki.fasterxml.com/JacksonPolymorphicDeserialization

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM