java - Jackson - 将接口(interface)反序列化为枚举

标签 java json jackson

我有一个接口(interface) Event 和多个实现此接口(interface)的枚举(UserEventBusinessEvent 等)。

我想反序列化以下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/

相关文章:

java - Jersey ,Tomcat : The requested resource is not available error in InjelliJ

java - 在 selenium webdriver (Java) 中查找嵌套元素

java - jackson YAML : support for anchors and references

java - 无法读取 JSON : Current token (VALUE_STRING) not numeric, 无法使用数值访问器

jackson - 在 Jax-RS 应用程序中注册 JodaModule

java - 每次我想运行时,我都必须(项目>清理)。怎么不呢?

java - 让用户在扫描仪Java中仅输入整数

sql - 聚合列/行并将它们转换为有效的 JSON

java - 斯卡拉/ jack 森 : how to deserialize into generic type

java - 失败: HTTP error code : 400 While postin JSON data to URL