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

20

我不理解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 { }
  }

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

1个回答

50

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

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

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

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

带有@JsonView注释的示例POJO类:

User 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;
    }

Rest控制器

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

@ Gangadhar 所以基本上可以将JsonView看作REST服务中的Java访问修饰符,对吗?如果是这样的话——那么我就明白为什么存在这种不同类型的视图类了。您的回答非常清楚。谢谢。但请问,如果我的程序中只有一个视图(我指访问级别),那么我能否只使用JsonView()(不带括号中的类)来分配默认的object.class作为视图类呢? - IngeniousTom
1
如果您没有不同的类,那么您可能不需要使用@JsonView,序列化程序将包括所有内容。但是@JsonView也可以解决JPA和Jackson之间的双向关系的序列化问题,因此它非常常见,但您还有其他方法来解决序列化问题。 - fabioresner
通过“classes”,我指的是您问题中的视图/级别。 - fabioresner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接