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

2022-09-02 11:37:33

我不明白杰克逊的@JsonView是什么(Views.MyClass.class)。我知道我可以以这种方式注释POJO的字段和方法,以过滤未注释的字段和方法,使其无法使用JSON进行序列化。但是什么是 Views.Myclass 类?它是杰克逊库的模板类吗?

为什么 Views 类中会有很多类?例如:

 class Views {
            static class Public { }
            static class ExtendedPublic extends PublicView { }
            static class Internal extends ExtendedPublicView { }
  }

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


答案 1

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

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

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

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

带注释的示例 POJO 类@JsonView

用户 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();
    }
}

答案 2