首页 > 解决方案 > 如何配置 Jackson 以首先序列化基类?

问题描述

我有一些存在于层次结构中的 JSON 模式:A 扩展 B 扩展 C。我使用jsonschema2pojo从这些模式生成 Java 类,它们被生成到匹配的类层次结构中。

由于我生成类的方式,我无法精细控制哪些注释可以应用于哪些字段(即@JsonPropertyOrder

当我与杰克逊连载时,我得到类似

{
    "propertyOfA": "razz",
    "propertyOfA": "jazz",
    "propertyOfA": "baz",
    "propertyOfB": "bar",
    "propertyOfC": "foo"
}

这是正确的,因为属性顺序在 JSON 中没有意义。但是,我的实际消息很长 - 数千个字符 - 在浏览日志时,如果更通用的属性(来自基本模式,模式 C 的那些),其中只有少数,首先出现会更方便在消息中。

模式/类中的单个属性顺序并没有给我带来太多困扰,但如果我能让杰克逊先下降层次结构然后回溯,那就太好了。

{
    "propertyOfC": "foo",
    "propertyOfB": "bar",
    "propertyOfA": "razz",
    "propertyOfA": "jazz",
    "propertyOfA": "baz"
}

我检查了所有的Features 和MapperFeatures,我发现唯一影响顺序的是SORT_PROPERTIES_ALPHABETICALLY.

我还能在ObjectMapper级别上做些什么,或者在不改变班级的情况下影响这个顺序吗?

标签: javajsonjackson

解决方案


您可以在其(生成的)源文件之外的类上应用mixin注释。例如

在一个新文件上,定义一个接口:

@JsonPropertyOrder({"propertyOfC", "propertyOfB"})
public interface MixinA {
}

并将其注册到您的ObjectMapper

objectMapper.addMixIn(A.class, MixinA.class);

此顺序注释中列出的属性首先出现,因此您可以跳过 A 的属性。


推荐阅读