2012-07-11 88 views
3

我正在使用促銷代碼的網站上爲用戶提供免費會員資格。成員註冊的級別是促銷代碼對象的屬性,並以int或1或2的形式存儲在數據庫中。但是,唯一一次成員級別屬性與網站的用戶界面相關的情況是與特定促銷代碼關聯的着陸頁。所以對於這種情況,我不希望JSON忽略成員級別。在用戶返回到該網站並有與其帳戶關聯的促銷代碼對象後,我們不再關心其成員級別,因此我希望JSON可以忽略成員級別屬性。屬性@JSONIgnore是否可以在每次調用時設置?

所以我的問題是,是否有可能在每個訪問的基礎上設置一個對象的屬性爲@JSONIgnore,還是隻能忽略或不能忽略一個屬性?換句話說有沒有像object.getAttribute().setAttributeJSONIgnore(true | false)這樣的方法?

+1

參見:http://stackoverflow.com/questions/11232045/serialization-and-deserialization-with-jackson-how-to-programmatically-ignore -f/11233190#11233190。您無法在運行時選擇性地打開/關閉'@ JsonIgnore'。 – pb2q 2012-07-11 18:27:48

+0

很高興知道。歡呼聲 – EJay 2012-07-11 18:31:20

+0

我認爲這個問題表明應用程序業務邏輯被放在錯誤的地方。我建議讓數據序列化/反序列化(傳輸)層儘可能愚蠢,並將業務邏輯放在人們期望的地方,在哪裏更容易維護。 – 2012-07-12 17:50:31

回答

4

編號基於註釋的方法是靜態的,因爲儘管您可以使用自定義AnnotationIntrospector,但由於結構的構造昂貴,導致JsonSerializer實例被重用。

但有些方法可以過濾出屬性,例如查看「Filtering Properties」這篇文章。

2

我已經做了類似的JSONViews(http://wiki.fasterxml.com/JacksonJsonViews)。

您將創建一個基本視圖,然後使用PromoPage視圖對其進行擴展。在要序列化的對象中,您需要將註釋添加到每個屬性。所以,你要的那些出現每次將

@JsonView(Views.Base.class) 
String name; 

要只顯示那些特定的促銷頁面會像

@JsonView(Views.PromoPage.class) 
Integer memberLevel; 

然後,如果你有不同的JAX-RS方法的性質用於獲取promopages比其他的登陸頁面,你可以註釋,象這樣

@JsonView(Views.Base.class) 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Object getNormalLandingPageInfo() { 
    ... 
    } 

    @JsonView(Views.PromoPage.class) 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Object getPromoLandingPageInfo() { 
    ... 
    } 

適當的查看方法,如果你不這樣做,在你的邏輯,你可以做任何你想做的確定何時顯示PromoPage視圖,然後做這樣的事情

if (showPromoPage) 
    objectMapper.writeValueUsingView(out, object, Views.PromoPage.class); 
else 
    objectMapper.writeValueUsingView(out, object, Views.Base.class); 
相關問題