我目前正在尋找一種方法來以多種方式序列化一個對象,而不會直接干擾這些類。 (如添加大量的註釋)Jackson2 PropertyFilter的嵌套屬性,還是有另一種方式?
想像這樣的一類:
class User {
String id;
String name;
String email;
...
User manager;
}
的SimplePropertyFilter
提供幾乎所期望的功能,但問題是,這種過濾器將忽略當前對象的水平和應用所有定義的過濾器在每個對象上,它是否是嵌套的。
我不僅限於過濾器,但我想避免爲每個所需的json響應編寫多個類。 Jackson2有沒有辦法實現這種行爲?
如果我們想序列化此爲我們所需要的所有字段的編輯形式,但對於用戶的列表,我們可能只需要其中的一部分。
對於經理,但我們總是需要「僅」id
和name
。這就是搜索解決方案的原因。
的JSON輸出應該成爲這樣的事情:
{
"id" : "20",
"login" : "USER20",
"name" : "User 20",
"email" : "[email protected]",
"manager" : {
"id" : "1",
"name" : "Administrator"
}
}
我覺得像屬性篩選方法就是設法讓我相當接近所需的解決方案,但是從我發現了什麼,你只能定義「簡單「的屬性。
public class UserJsonWriter {
public String toJson() {
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept("id", "login", "name", "email", "manager");
// Unfortunatly I cannot write:
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept("id", "login", "name", "email", "manager.id", "manager.name");
User user = userService.getUser(20);
ObjectMapper copy = objectMapperFactoryBean.getCopy();
copy.addMixInAnnotations(User.class, CustomFilter.class);
ObjectWriter writer = copy.writer(new SimpleFilterProvider().addFilter("customFilter", filter));
return writer.writeValueAsString(user);
}
}
@JsonFilter("customFilter")
public class CustomFilter {
}
目前輸出看起來像這樣。
{
"id" : "20",
"login" : "USER20",
"name" : "User 20",
"email" : "[email protected]",
"manager" : {
"id" : "1",
"login" : "ADMIN",
"name" : "Administrator",
"email" : "[email protected]",
"manager" : {
... (might continue multiple times)
}
}
}
從我所知道的,PropertyFilter不知道該序列的當前「位置」,同樣沒有JSON的發電機(直接)。
我可以看到要使用的最簡單的解決方案將在此過濾過程中查找嵌套屬性。傑克遜存在這種可能性嗎?可能有其他庫支持這種行爲?
編輯:我也想補充一點,我使用Spring MVC,可能有一種方法通過Spring?
謝謝