我是使用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将需要是几个不同子类集合中的一个。
例如,如果操作为“ stream”,则TestMessageMetadata的类型将为TestMessageStreamMetadata。 TestMessageMetadata的每个子类都具有不同的属性(TestMessageStreamMetadata可能具有4个字段,仅适用于“流”类型的消息,而对于某些其他操作,可能只有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;

}

关于java - 使用带有嵌套类的Jackson JSON反序列化吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38272599/

10-10 17:12