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

标签 java json serialization jackson

(免责声明:过于简单化。实际情况要复杂得多。)

假设我有两个系统,生产者和消费者。他们的代码是完全独立的,除了一个共享接口(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/

相关文章:

java - super . super .func()? - Java多态性

java - 使用 Spring 返回 XML 响应 Rest API

json - 在 Azure 数据工厂中读取变量 JSON 时出现问题

java - 在方法中处理不同的实例变量

java - java中xpath表达式动态赋值

java - 哪种数据结构适合求解方程

javascript - Google javascript - 访问和重命名数字对象名称

c# - 具有属性的集合的 Xml 序列化

c# - 使用 protobuf-net 的惰性流驱动对象序列化

c# - 在 C# 中将数据对象导入/导出到 CSV