是否可以在运行时动态自定义JSON响应中的键名,而不是为域级对象创建单独的POJO类?
我正在使用带有Web Starter的Spring Boot 1.5.3,因此包含了Jackson依赖性。我在JSON中返回响应。通常,如果我需要自定义键名,我会使用Jackson注释创建单独的POJO类。例如,
public class Movies {
private List<String> movies;
public Movies(List<String> movies) {
this.movies = movies;
}
public List<String> getMovies() {
return this.movies;
}
public void setMovies(List<String> movies) {
this.movies = movies;
}
}
当我使用以下代码从@RestController
返回此内容时:
@RestController
public class MoviesController {
@Service
private MovieService movieService;
@RequestMapping("/movies/list")
public ResponseEntity<Movies> getMovies() {
return new ResponseEntity<Movies>(this.movieService.getMovies(), HttpStatus.OK);
}
}
我在调用此终点时返回JSON响应:
{ "movies" : [ "Iron Man", "Spiderman", "The Avengers", "Captain America" ] }
我不想创建Movies
POJO。相反,我想要一个通用类型的POJO:
public class GenericResponse {
@JsonProperty("movies") // <- this needs to be dynamic
private List<String> data;
...
}
...我可以在实例化GenericResponse
时以某种方式发送我想要的任何密钥名称,而不是通过@JsonProperty
注释对密钥名称进行硬编码。这可能吗?
答案 0 :(得分:1)
将Movies
和GenericResponse
替换为Map<String, List<String>>
,然后执行
map.put("movies", Arrays.asList("Iron Man", "Spiderman", "The Avengers", "Captain America"));
将Map
序列化为JSON作为JSON对象,将地图键作为字段名称,以及地图值和字段值。
答案 1 :(得分:1)
通过地图做到这一点怎么样?
public class GenericResponse {
@JsonValue
private Map<String, List<String>> data;
}
您可以使用@JsonValue注释忽略“数据”字段名称!