Jackson JSON

Infra 提供了对 Jackson JSON 库的支持。

JSON 视图

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

  • Java

@RestController
public class UserController {

  @GetMapping("/user")
  @JsonView(User.WithoutPasswordView.class)
  public User getUser() {
    return new User("eric", "7!jd#h23");
  }
}

public class User {

  public interface WithoutPasswordView {};
  public interface WithPasswordView extends WithoutPasswordView {};

  private String username;
  private String password;

  public User() {
  }

  public User(String username, String password) {
    this.username = username;
    this.password = password;
  }

  @JsonView(WithoutPasswordView.class)
  public String getUsername() {
    return this.username;
  }

  @JsonView(WithPasswordView.class)
  public String getPassword() {
    return this.password;
  }
}
@JsonView 允许视图类数组,但每个控制器方法只能指定一个。如果需要激活多个视图,可以使用复合接口。

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

  • Java

@RestController
public class UserController {

  @GetMapping("/user")
  public MappingJacksonValue getUser() {
    User user = new User("eric", "7!jd#h23");
    MappingJacksonValue value = new MappingJacksonValue(user);
    value.setSerializationView(User.WithoutPasswordView.class);
    return value;
  }
}

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

  • Java

@Controller
public class UserController extends AbstractController {

  @GetMapping("/user")
  public String getUser(Model model) {
    model.addAttribute("user", new User("eric", "7!jd#h23"));
    model.addAttribute(JsonView.class.getName(), User.WithoutPasswordView.class);
    return "userView";
  }
}