一尘不染

Jackson中的JSON View类是什么,它如何工作?

json

我不明白杰克逊的@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 { }
  }

为什么需要它,它如何工作?


阅读 374

收藏
2020-07-27

共1个答案

一尘不染

用于@JsonView根据序列化的上下文过滤字段。在将数据返回到REST客户端时,根据调用哪个REST服务,我们需要限制在使用相同数据模型时要序列化的数据。

假设我们要创建两个REST服务:

第一个服务返回一些用户信息,例如名字和姓氏,但不返回附加的消息。

第二个服务返回第一个服务的所有信息以及附加到当前用户的消息。

带有@JsonView注释的样本POJO类

用户Pojo类

@JsonView(User.Views.Public.class)
    public String getFirstname() {
        return firstname;
    }

 @JsonView(User.Views.Public.class)
    public String getLastname() {
        return lastname;
    }

留言Pojo课

@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();
    }
}
2020-07-27