(免责声明:过于简单化。实际情况要复杂得多。)
假设我有两个系统,生产者和消费者。他们的代码是完全独立的,除了一个共享接口(interface):
public interface Thing {
String getName();
String getDescription();
int getPrice();
}
想法是 Producer 创建一堆数据并通过 HTTP 将其作为 JSON 发送。 Producer 有一堆 Thing 的实现,每个都有额外的元数据和数据生成过程所需的东西。
除了最顶层的薄薄一层之外,生产者不希望拥有任何关于 Jackson/序列化的知识,因此序列化属性应该被排除在 Thing 实现之外。由于 future 的实现量很可能会增长,因此所有这些都使用 mixins 很快就会变得不可持续。人们认为将注释应用于 Thing 接口(interface)本身就足够了。
第一个简单的方法是在接口(interface)上添加一个@JsonSerialize 注释。起初,这似乎可行,但导致了一个问题。 Thing 的一些实现是枚举,导致 Jackson 只是将它们序列化为它们的名称,而不是接口(interface)中定义的字段。
一些谷歌搜索显示了以下注释:
@JsonFormat(shape= JsonFormat.Shape.OBJECT)
虽然它确实通过序列化字段而不是名称解决了问题,但它做得也很好,因为它还开始序列化未在 Thing 接口(interface)中定义的特定于实现的公共(public)字段,结果不仅在信息泄漏方面,而且由于数据包含未知条目,消费者反序列化失败。
由于进一步谷歌搜索没有产生任何结果,我能想到的唯一解决方案是将所有这些字段标记为可忽略,由于前面提到的原因,这是非常不受欢迎的。
有没有什么办法,只需更改接口(interface)本身及其注释,就可以强制要求在涉及类和枚举时对这些字段进行序列化,不多也不少?
最佳答案
我在与 Jackson 合作时遇到了这个问题。反序列化失败,因为在反序列化过程中,Jackson 无法找到多态引用类型。
您应该使用@JsonTypeInfo 注释您的界面。
类似于:
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "class")
您的问题中没有太多代码,因此没有这个答案。
关于java - Jackson:将枚举序列化为接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16443608/