问题描述
我们有一个模型:
@JsonPropertyOrder({
"id","alpha2_code","alpha3_code","name"
})
@Getter
@Setter
public class Country {
private Long id;
private String alpha2Code;
private String alpha3Code;
private String name;
}
和一个 ObjectMapper
实例,例如:
var jsonMapper = new ObjectMapper();
jsonMapper.enable(SerializationFeature.INDENT_OUTPUT);
jsonMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
jsonMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
jsonMapper.registerModule(new JavaTimeModule());
创建以下 JSON:
{
"id": 1,"alpha2_code": "NL","alpha3_code": "NLD","name": "Netherlands",}
这一切都按预期工作。
值得一提的是,我们使用 @JsonPropertyOrder
对输出进行排序。
此注释需要字段名称作为它们在输出中的方式;因此 SNAKE CASE 像 "alpha2_code"
和 not "alpha2Code"
作为 Java 属性名称。
现在我们还需要创建 YAML 作为输出(基于相同的模型)。 但是 YAML 输出的命名约定需要是 KEBAB CASE。
我的想法是将 @JsonPropertyOrder
移动到混合并引入 CountrySnakeMixin
和 CountryKebabMixin
混合类并在单独的对象映射器中使用它们。>
对于这个简单的例子,它看起来很简单,但是对于 50 - 100 个类的模型,这将成为维护的噩梦。
解决方法
我测试过
这个注解需要字段名作为它们在 输出
不正确:
@JsonPropertyOrder({
"id","alpha2Code","alpha3Code","name"
})
按预期工作,在蛇和烤肉串的情况下也会改变顺序。