[英]Spring Boot + Jackson: Serialize an object in different ways depending on the called REST API
我正在开发一个公开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不允许视情况选择要使用的序列化程序(它始终使用最后添加的序列化程序)。
所以我现在有点笨了。 有人知道允许控制器选择如何序列化类的一种干净方法吗?
我认为您应该在此处使用DTO
,可以对不同的终结点使用不同的DTO
,并且可以选择要包括或排除的字段。 另外,如果需要,可以装饰它们。
在这里,您有在端点中使用DTO
的好处的列表: REST API-是否使用DTO
?
使用@JsonIdentityInfo
您的问题已在此处回答: Jackson-具有双向关系的实体的序列化(避免循环)
您可以对实体使用@JsonManagedReference
批注,也可以使用@JsonIdentityInfo
和@JsonBackReference
。
您甚至可以使用@JsonIgnore
或@JsonView
忽略关系的@JsonView
。
如果要自己管理序列化/反序列化,请使用自定义实现(例如@JsonDeserialize
)。
Eugen为此提供了很好的教程 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.