2014-09-04 266 views
1

我想進一步瞭解什麼是this question,我一直漫遊在一個堅實的小時現在沒有找到任何東西。傑克遜:如何防止字段序列化(同時保持反序列化)

基本上,我試圖做的是在反序列化過程中通過傑克遜內部反射算法正確實例化一個屬性,但在序列化時有相同的屬性而不是序列化。

我知道@JsonIgnore@JsonIgnoreProperties但顯然我似乎無法正確使用:當我喂傑克遜性質的適當的地圖無論是我的財產是正確的反序列化,但它也出現在序列化結果,或者(當使用@JsonIgnore)它沒有序列化(這是想要的),但也沒有反序列化(不想)。

例子:

public class Foo { 

    /* This is the property I want to be instanciated by Jackson upon deserialization 
    * but not serialized upon serialization 
    */ 
    private final Object bar = null; 

    public Object getBar() { 
     return bar; 
    } 
} 

更糟糕的是,你可以看到,物業最終的(這就是爲什麼我在Foo instanciation很熱衷於使用傑克遜反射能力,通過反序列化)。我已經閱讀了有關注解setter和getter的潛在解決方案,但是如果可能的話,我想保留此屬性。 如果不可能,我會解決非最終財產。

我很感謝答案,不建議自定義序列化器/反序列化器,我的代碼庫目前是免費的,如果解決方案可能是最小的影響,那將是完美的。再說一遍,我不是傑克遜的專家,所以如果我問的是不可能的話,我顯然會接受其他答案。

我也讀過this thread on github,但目前沒有任何建議的實施方式實際上已經實施。

感謝


編輯:使事情更清晰

public class Foo { 

    private final String bar = null; 

    public String getBar() { 
     return bar; 
    } 

    @Override 
    public String toString() { 
     return bar; 
    } 
} 


public void testMethod() throws IOException { 
     String json = "{\"bar\":\"Value\"}"; 
     ObjectMapper mapper = new ObjectMapper(); 
     Foo foo = mapper.readValue(json, Foo.class); 
     System.out.println(foo); // should have a bar property set to "Value" 
     System.out.println(mapper.writeValueAsString(foo)); // should return an empty JSON object 
} 

回答

2

我不知道它是否是優雅的解決方案,但你可以使用MixIn功能。你必須創建新的接口,它可能看起來像下面:

interface FooMixIn { 

    @JsonIgnore 
    String getBar(); 
} 

假設你POJO看起來是這樣的:

class Foo { 

    private final String bar = null; 

    public String getBar() { 
     return bar; 
    } 

    @Override 
    public String toString() { 
     return bar; 
    } 
} 

現在你要告訴Jackson要忽略這個屬性:

String json = "{\"bar\":\"Value\"}"; 
System.out.println(json); 
ObjectMapper deserializeMapper = new ObjectMapper(); 
deserializeMapper.addMixInAnnotations(Foo.class, FooMixIn.class); 
System.out.println(deserializeMapper.readValue(json, Foo.class)); 

以上示例打印:

{"bar":"Value"} 
null 

沒有deserializeMapper.addMixInAnnotations(Foo.class, FooMixIn.class);線以上程序打印:

{"bar":"Value"} 
Value 

編輯1


如果你想達到的結果就像你表明你要創建兩個ObjectMapper S和定製他們。看下面的例子:

String json = "{\"bar\":\"Value\"}"; 
ObjectMapper deserializerMapper = new ObjectMapper(); 
Foo foo = deserializerMapper.readValue(json, Foo.class); 
System.out.println("Foo object: " + foo); 

ObjectMapper serializerMapper = new ObjectMapper(); 
serializerMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); 
serializerMapper.addMixInAnnotations(Foo.class, FooMixIn.class); 
System.out.println("JSON: " + serializerMapper.writeValueAsString(foo)); 

對於序列化你必須使用一個實例和反序列化你必須使用另一個實例。

+0

該死的! +1,因爲你的回答完全符合你描述的內容,並將我介紹給Jackson的MixIn,但它也讓我意識到我已經將序列化/反序列化過程混淆了><我編輯了我的問題,如果你知道任何方式,例如回答我的問題真正的需要,我會很樂意接受你的答案。 – m4rtin 2014-09-05 11:21:38

+0

現在我真的不明白你想做什麼。你想在序列化過程中隱藏這個屬性,並且'Jackson'應該能夠反序列化它。這是真的嗎?我想提供幫助,但是你必須告訴我你的'POJO'和'JSON'是怎麼樣的,並且你必須告訴我你是如何序列化它的(使用JSON輸出)並對它進行反序列化。好的例子會超過1000字。 – 2014-09-05 19:57:12

+0

是的,這正是我想要做的,對不起,我的問題首先不夠清楚。我編輯它來反映你的例子。讓我們一致認爲*反序列化*過程意味着從JSON字符串到Foo實例以及從Foo實例到JSON字符串的序列化*過程。 – m4rtin 2014-09-07 12:53:49