Spring Boot + Jackson:根据所调用的REST API,以不同的方式序列化对象

时间:2018-10-16 09:10:32

标签: java json spring-boot jackson json-serialization

我正在开发一个公开REST API的Spring Boot Web应用程序,并且在JSON序列化方面遇到麻烦。

比方说,我有两个A和B类,它们是一对多的双向关系。

这意味着我有这样的东西:

public class A {
    private List<B> bList;
    ...
}

public class B {
    private A owner;
    ...
}

当涉及到JSON序列化时,当然会有一个循环。

这是我的问题:

  • 在专注于A的API方法中(例如“向我提供数据库中所有As的列表”),我想要JSON序列化,其中:
    • A对象确实包含B个列表
    • B对象不包含其A所有者
  • 在专注于B的API方法中(例如“给我DB中所有B的列表”),我想要JSON序列化,其中:
    • A对象不包含其B的列表
    • B对象确实包含其A所有者

我相信我可以将其与@JsonView注释一起使用,但是我认为这不是一个优雅的解决方案。在我的应用程序(具有两个以上的类)中,我需要创建和管理至少4或5个JsonViews:因此,在我的模型类中,对于每个属性,我必须管理一堆杂乱的@JsonView注释。相反,我认为模型类不应意识到这样的事实,即它们根据API方法具有不同的JSON表示形式。

我搜索了如何使用自定义JSON序列化程序,并发现Jackson允许使用其SimpleModule进行此操作。但是,似乎SimpleModule不允许逐案选择使用哪个序列化程序(它始终使用最后添加的序列化程序)。

所以我现在有点笨了。有谁知道允许控制器选择如何序列化类的干净方法?

3 个答案:

答案 0 :(得分:0)

我认为您应该在此处使用DTO,可以将不同的DTO用于不同的端点,还可以选择要包括或排除的字段。另外,如果需要,可以装饰它们。

以下列出了在端点中使用DTO的好处:REST API - DTOs or not?

答案 1 :(得分:0)

使用@JsonIdentityInfo

您的问题已在此处回答:Jackson - serialization of entities with birectional relationships (avoiding cycles)

答案 2 :(得分:0)

您可以对实体使用@JsonIdentityInfo批注,也可以使用@JsonManagedReference@JsonBackReference

您甚至可以忽略与@JsonIgnore@JsonView的关系的一方。

如果您想自己管理序列化/反序列化,请使用自定义实现(例如,使用@JsonDeserialize)。

Eugen为此提供了一个不错的tutorial