Spring 提供对 Jackson JSON 库的支持。

对 jackson json 提供了内置的支持,所以说可以直接引入 jackson 的依赖

  1. implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.13.2.2'

前面章节的 body 只能返回字符串的例子就可以直接改成返回对象了,如下所示。对于 @ResponseBody 的注解返回的对象(期望返回 JSON 数据),也可以直接生效使用了

  1. @GetMapping("/files")
  2. public ResponseEntity<Pet> upload1(HttpEntity<Pet> entity) {
  3. return ResponseEntity.ok().eTag("etag").body(new Pet());
  4. }

JSON Views / JSON 视图

Spring MVC 为 Jackson 的序列化视图 提供了内置支持,它只允许渲染一个对象中所有字段的子集。为了与 @ResponseBodyResponseEntity控制器方法一起使用,你可以使用 Jackson 的 @JsonView注解来激活一个序列化视图类,如下例所示:

  1. @RestController
  2. public class UserController {
  3. @GetMapping("/user")
  4. @JsonView(User.WithoutPasswordView.class)
  5. public User getUser() {
  6. return new User("eric", "7!jd#h23");
  7. }
  8. }
  9. public class User {
  10. public interface WithoutPasswordView {};
  11. public interface WithPasswordView extends WithoutPasswordView {};
  12. private String username;
  13. private String password;
  14. public User() {
  15. }
  16. public User(String username, String password) {
  17. this.username = username;
  18. this.password = password;
  19. }
  20. @JsonView(WithoutPasswordView.class)
  21. public String getUsername() {
  22. return this.username;
  23. }
  24. @JsonView(WithPasswordView.class)
  25. public String getPassword() {
  26. return this.password;
  27. }
  28. }

:::info @JsonView 允许一个视图类的数组,但每个控制器方法只能指定一个。如果你需要激活多个视图,你可以使用一个复合接口。 :::

如果你想以编程方式进行上述操作,而不是声明一个 @JsonView注解,用 MappingJacksonValue 来包裹返回值,并使用它来提供序列化的视图:

  1. @RestController
  2. public class UserController {
  3. @GetMapping("/user")
  4. public MappingJacksonValue getUser() {
  5. User user = new User("eric", "7!jd#h23");
  6. MappingJacksonValue value = new MappingJacksonValue(user);
  7. value.setSerializationView(User.WithoutPasswordView.class);
  8. return value;
  9. }
  10. }

对于依赖视图解析的控制器,你可以将序列化的视图类添加到模型中,如下例所示:

  1. @Controller
  2. public class UserController extends AbstractController {
  3. @GetMapping("/user")
  4. public String getUser(Model model) {
  5. model.addAttribute("user", new User("eric", "7!jd#h23"));
  6. model.addAttribute(JsonView.class.getName(), User.WithoutPasswordView.class);
  7. return "userView";
  8. }
  9. }