如何重命名 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"
]
}
我有以下控制器从数据库返回项目列表:
@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"
]
}