[英]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.