我有一个接口(interface) Event
和多个实现此接口(interface)的枚举(UserEvent
、BusinessEvent
等)。
我想反序列化以下json数据:
{
"event" : "SIGNUP"
}
给这个bean:
public class Input
{
private Event event;
public Event getEvent() {..}
public void setEvent(Event event) {..}
}
public enum UserEvent implements Event
{
SIGNUP;
}
在这里,我想将事件反序列化为 UserEvent.SIGNUP
。
我怎样才能做到这一点?阅读 @JsonTypeInfo
似乎表明需要一个额外的 type
属性,但在这种情况下,只有一个字符串直接映射到枚举值。
最佳答案
您正在为 Input
中的字段 event
使用 Event
接口(interface),而 jackson 对 UserEvent
一无所知作为此接口(interface)的实现。
您可以使用自定义 JsonDeserializer
来获取值:
public interface Event {
}
public static class Input
{
private Event event;
@JsonDeserialize(using = EventDeserializer.class)
public Event getEvent() {
return event;
}
public void setEvent(Event event) {
this.event = event;
}
}
public enum UserEvent implements Event
{
SIGNUP;
}
public static class EventDeserializer extends StdDeserializer<Event> {
protected EventDeserializer() {
super(Event.class);
}
@Override
public Event deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return UserEvent.valueOf(p.getText());
}
}
@Test
public void converEnum() throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
Input input = objectMapper.readValue("{\n" +
" \"event\" : \"SIGNUP\"\n" +
"}", Input.class);
Assert.assertThat(input.getEvent(), Matchers.is(UserEvent.SIGNUP));
}
关于java - Jackson - 将接口(interface)反序列化为枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41765648/