使用Jackson JSON使用w /嵌套类反序列化?

时间:2016-07-08 17:43:56

标签: java json serialization jackson

我刚开始使用Jackson&反序列化JSON。我正在尝试创建一个消息处理器并具有以下内容:

@JsonDeserialize(builder = TestMessage.TestMessageBuilder.class)
private static class TestMessage {
    @Nonnull
    private Long timestamp;
    @Nonnull
    private String regionId;
    @Nonnull
    private String userId;
    @Nonnull
    private String action; 
    @Nonnull
    private TestMessageMetadata metadata;

    @JsonPOJOBuilder(withPrefix = "") 
    public static class TestMessageBuilder {}
}

问题在于,根据消息的类型操作类型,TestMessageMetadata将需要是一组几个不同的子类之一。 例如,如果action是“stream”,则TestMessageMetadata必须是TestMessageStreamMetadata类型。 TestMessageMetadata的每个子类都有不同的属性(TestMessageStreamMetadata可能有4个字段仅适用于“流”类型的消息,而对于某些其他操作,可能只有1个字段仅适用于该类型的操作等。)

处理器只需要有一个总体消息类,那么有哪些方法可以处理多种动作类型?非常感谢帮助!

1 个答案:

答案 0 :(得分:1)

  

问题在于,取决于消息的动作类型   随之而来的是,TestMessageMetadata将需要成为一组中的一员   一些不同的子类。

似乎在寻找@JsonTypeInfo@JsonTypeInfo用于处理多态类型。它配置了属性值的实际类型可能是多个子类型之一的情况。

以下是一个例子:

class TestMessage {

    private String action; 

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_POPERTY, propery = "action")
    @JsonSubTypes({
        @JsonSubTypes.Type(value = TestMessageStreamMetadata.class, name = "stream"),
        @JsonSubTypes.Type(value = TestMessageFooMetadata.class, name = "foo")
    })
    private TestMessageMetadata metadata;

}