杰克逊可以使用可自定义的密钥名称序列化为JSON吗?

时间:2017-05-12 07:38:37

标签: java json jackson

是否可以在运行时动态自定义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注释对密钥名称进行硬编码。这可能吗?

2 个答案:

答案 0 :(得分:1)

MoviesGenericResponse替换为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注释忽略“数据”字段名称!