2015-10-22 51 views
3

嗨我有幾個嵌入對方的UI對象。實例1:如何更改JsonView的特定屬性

class CarUI { 
    public UserUI user; 
    public UserUI agent; 
    .... 
    public UserUI getUser() { 
    return user; 
    } 
    public UserUI getAgent() { 
    return agent; 
    } 
} 
class UserUI { 
    @JsonView({Views.Public.class,Views.Private.class}) 
    public String name; 
    @JsonView({Views.Private.class}) 
    public String phone; 
    ... 
} 

正如你可以看到,如果我序列UserUI作爲公共我會暴露出唯一的名字,但對私人,我會公開所有領域。

這裏是我的問題:當我序列化對象CarUI我要揭露唯一的名字爲「用戶」和兩個姓名+手機「代理」。這基本上意味着在getter()的getter我想要更改JsonView Views.Public.class和getAgent()我想將其更改爲Views.Private.class

是否有方法來覆蓋JsonView in getters使所有返回對象的層次結構現在使用這個新的JsonView序列化?

編輯 如下所示,你可以用JsonView繼承來解決我的例子#1。什麼更通用。下面是實施例#2:

class CarUI { 
    public UserUI user; 
    public UserUI agent; 
    .... 
    public UserUI getUser() { 
    return user; 
    } 
    public UserUI getAgent() { 
    return agent; 
    } 
} 
class UserUI { 
    @JsonView({Views.Public.class,Views.Private.class}) 
    public String name; 
    @JsonView({Views.Private.class}) 
    public String phone; 
    @JsonView({Views.Public.class}) 
    public String avatarUrl; 
    ... 
} 

在這個例子中Id喜歡用於用戶爲代理和名稱+ avatarUrl顯示名+電話。

回答

2

@JsonView接受繼承。 Views.Private字段擴展Views.Public字段。這意味着Views.Private序列化也將查找Views.Public註釋。

public Views { 
    public Public {} 
    public Private extends Public {} 
} 

class CarUI { 
    public UserUI user; 
    public UserUI agent; 
    .... 
    @JsonView(Views.Public.class) 
    public UserUI getUser() { 
    return user; 
    } 
    @JsonView(Views.Private.class) 
    public UserUI getAgent() { 
    return agent; 
    } 
} 

class UserUI { 
    @JsonView(Views.Public.class) 
    public String name; 
    @JsonView(Views.Private.class) 
    public String phone; 
    ... 
} 

表示示例2

可以引入多個類,如:

public Views { 
    public Public {} 
    public Private1 extends Public {} 
    public Private2 extends Public {} 
} 

class CarUI { 
    public UserUI user; 
    public UserUI agent; 
    .... 
    public UserUI getUser() { 
    return user; 
    } 
    public UserUI getAgent() { 
    return agent; 
    } 
} 
class UserUI { 
    @JsonView(Views.Public.class) 
    public String name; 
    @JsonView({Views.Private1.class}) 
    public String phone; 
    @JsonView({Views.Private2.class}) 
    public String avatarUrl; 
    ... 
} 

或者你可以使用視圖無屬性,並使用無繼承:

public Views { 
    public Public {} 
    public Private {} 
} 

class CarUI { 
    public UserUI user; 
    public UserUI agent; 
    .... 
    public UserUI getUser() { 
    return user; 
    } 
    public UserUI getAgent() { 
    return agent; 
    } 
} 
class UserUI { 
    // This one is view-less shows every time unless you specificy 
    public String name; 
    @JsonView({Views.Private.class}) 
    public String phone; 
    @JsonView({Views.Public.class}) 
    public String avatarUrl; 
    ... 
} 

... 
// If you want to hide view-less properties, default is true 
objectMapper.configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false); 
... 
+0

謝謝。這將適用於2個JsonView在屬性上重疊的示例。如果公共擁有私人沒有的財產並且與之相反,該怎麼辦?參見上面的例子#2。 –

+0

編輯我的答案。試圖在@JsonView註釋中使用多個類,但沒有運氣。 – Ghokun

1

剛如果有人需要,會發現更通用的情況基本上你可以使用不同的JsonView來改變你的屬性在內部:

@JsonView({ Views.Detail.class}) 
    public JsonNode getAgent() throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     String json = mapper.writerWithView(Views. Private.class).writeValueAsString(agent); 
     return mapper.readTree(json); 
    }