2017-09-26 30 views
0

我有一個簡單的問題,現在正在讓我想方設法弄清楚。反序列化特定屬性的列表

我想反序列化這樣的:

[ 
    { "a": "a", "b": 1 } 
    { "a": "b", "b": 2 } 
] 

進入這個:

@Data 
public class MyObject { 
    private List<BaseType> rootList; 
} 

我想這樣做的原因是因爲我以前只延長ArrayList的,但現在我真的需要一個真正的類它需要繼承,所以我不能再這樣做了。我基本上只需要傑克遜來填充那個內在屬性,而不是我必須包裝這個類。

有沒有這樣的註釋?

謝謝!

+0

附加BASETYPE類代碼 –

回答

1

如果我得到你的問題的權利,你想反序列化json數組到對象與數組字段,包含所有的json數組項。你可以做的一件事是創建自定義構造函數並用@JsonCreator對其進行註釋。對於序列化,您可以在rootList列表字段上方使用@JsonValue

private static String json = "[{\"a\":\"a\",\"b\":1},{\"a\":\"b\",\"b\":2}]"; 
@Data 
public static class MyObject { 
    @JsonValue // used during serialization 
    private List<BaseType> rootList; 
    @JsonCreator //used during deserialization 
    public MyObject(List<BaseType> items) { 
     this.rootList = items; 
    } 
} 

@Data 
public static class BaseType { 
    @JsonProperty 
    private String a; 
    @JsonProperty 
    private int b; 
} 

public static void main(String[] args) throws Exception { 
    ObjectMapper mapper = new ObjectMapper(); 
    MyObject value = mapper.readValue(json, MyObject.class); 
    System.out.println(value); 
    System.out.println(mapper.writeValueAsString(value)); 
} 
+0

難道就沒有別的辦法做到這一點以外創建@JsonCreator一個新的構造?儘管這是一個相當不錯的解決方案,它基本上就是我想要的,您是否測試過它以確保它能正確地反序列化?我即將對其進行測試。 –

+0

由於這個答案有點延遲,我最終制作了一個自定義的反序列化器,將這樣的根列表反序列化到具有自定義註釋的字段上。然後我使用@JsonDeserializer(使用= MyCustomDeserializer.class)對@JacksonInside進行了自定義註釋......儘管我喜歡使用本地jackson註釋的解決方案,因此我不必擔心Deserializer中的邊緣情況。 –

+0

@ A.Bello離開了一段時間,很抱歉拖延。是的,它應該像你期望的那樣工作。 '@ JsonDeserializer'也是很好的選擇,特別是如果你不能以任何方式改變POJO代碼,就像POJO是三維派對庫的一部分一樣,你仍然可以在mixin中使用'@ JsonDeserializer',但不能使用這種方法。是的,你需要在自定義構造函數上面有@JsonCreator或者2 -nd選項是使用靜態工廠函數。 [這是更多信息](http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html) – varren

相關問題