如何重命名 JSON 页面属性而无需编写完整的自定义序列化程序?

How to rename JSON page attribute without having to write a full custom serializer?

我有以下控制器从数据库返回项目列表:

@GetMapping(value = "/", produces = MediaType.APPLICATION_JSON_VALUE)
public Page<Movies> getAll(Pageable pageable) {
    return this.service.getAll(pageable);
}

正如预期的那样,Spring Boot 正确序列化它:

{
    "content": [ ... ],
    "pageable": { ... },
    "last": false,
    "totalPages": 2,
    "totalElements": 35,
    "size": 20,
    "number": 0,
    "sort": {
        "sorted": false,
        "unsorted": true,
        "empty": true
    },
    "numberOfElements": 20,
    "first": true,
    "empty": false
}

但是,我想重命名这些属性之一。例如,我想使用 items 而不是 content 作为键名。

在这种情况下,由于 Page 来自 org.springframework.data.domain,我无法使用 Jackson 注释重命名 属性。

我可以编写一个自定义序列化程序(类似于 this),但我只想重命名该属性,所以我不想从头开始编写它。

有什么更好的方法来处理这个问题?

另一种可能性是扩展 PageImpl 并添加 items 属性。然后您需要将 PageImpl 对象映射到您的自定义对象,通过将内容移动到 items.

content 留空

不确定这是否比编写自定义序列化程序更好,但至少这是另一种方法。

您可以为此使用 Mix-ins。您需要一个接口或抽象 class 来将更改应用于不可修改的 class:

interface MixIn<T> {
    @JsonProperty("items")
    List<T> getContent(); // rename property
}

然后注册混音:

mapper.addMixIn(Slice.class, MixIn.class);

或使用 Spring 启动:

@Bean 
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() { 
    return builder -> builder.mixIn(Slice.class, MixIn.class); 
}

Slice 是 class content 属性 居住的地方。 它会产生类似的东西:

{
   "last":true,
   "totalElements":1,
   "totalPages":1,
   "size":0,
   "number":0,
   "numberOfElements":1,
   "first":true,
   "sort":null,
   "items":[
      "listItem"
   ]
}