我不明白Jackson的@JsonView( Views.MyClass.class )是什么。 我知道我可以用这种方式注释POJO的字段和方法过滤未注释的以免被JSON序列化。但什么是Views.Myclass类?它是Jackson库的模板类吗?
为什么Views类中有很多类?例如:
class Views {
static class Public { }
static class ExtendedPublic extends PublicView { }
static class Internal extends ExtendedPublicView { }
}
为什么需要它以及它是如何工作的?
答案 0 :(得分:37)
使用@JsonView
根据序列化的上下文过滤字段。将数据返回到REST客户端时,根据调用的REST服务,我们需要限制在使用相同数据模型时将序列化哪些数据。
让我们说我们想要创建两个REST服务:
第一个服务返回一些用户信息,如名字和姓氏,但不包含附加到它的消息。
第二个服务返回第一个服务的所有信息以及附加到当前用户的消息。
带有@JsonView
注释的POJO类示例
@JsonView(User.Views.Public.class)
public String getFirstname() {
return firstname;
}
@JsonView(User.Views.Public.class)
public String getLastname() {
return lastname;
}
@JsonView(User.Views.Internal.class)
public List<Message> getMessages() {
return messages;
}
@RestController
public class SimpleRestController {
@Autowired
SimpleService simpleService;
@RequestMapping(value = "/user/public", method = RequestMethod.GET)
@JsonView(User.Views.Public.class)
public User getUserWithPublicData() {
return simpleService.loadUser();
}
@RequestMapping(value = "/user/internal", method = RequestMethod.GET)
@JsonView(User.Views.Internal.class)
public User getUserWithInternalData() {
return simpleService.loadUser();
}
}