我是使用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/