我该如何配置Jackson来首先序列化基类?

Mic*_*ael 5 java json jackson

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

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

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

{
    "propertyOfA": "razz",
    "propertyOfA": "jazz",
    "propertyOfA": "baz",
    "propertyOfB": "bar",
    "propertyOfC": "foo"
}
Run Code Online (Sandbox Code Playgroud)

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

架构/类中的各个属性顺序并不会给我带来太多麻烦,但是如果我能让Jackson先降到层次结构然后回溯,那将是很好的选择。

{
    "propertyOfC": "foo",
    "propertyOfB": "bar",
    "propertyOfA": "razz",
    "propertyOfA": "jazz",
    "propertyOfA": "baz"
}
Run Code Online (Sandbox Code Playgroud)

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

我还能在ObjectMapper-level上做其他事情,或者不改变类而影响该顺序吗?

Man*_*dis 4

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

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

@JsonPropertyOrder({"propertyOfC", "propertyOfB"})
public interface MixinA {
}
Run Code Online (Sandbox Code Playgroud)

并将其注册到您的ObjectMapper

objectMapper.addMixIn(A.class, MixinA.class);
Run Code Online (Sandbox Code Playgroud)

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