我有一個Java類MyPojo
,我有興趣從JSON反序列化。我已經配置了一個特殊的MixIn類,MyPojoDeMixIn
,以幫助我進行反序列化。 MyPojo
只有int
和String
實例變量與適當的getter和setters組合。 MyPojoDeMixIn
看起來是這樣的:將JSON反序列化爲ArrayList <POJO>使用Jackson
public abstract class MyPojoDeMixIn {
MyPojoDeMixIn(
@JsonProperty("JsonName1") int prop1,
@JsonProperty("JsonName2") int prop2,
@JsonProperty("JsonName3") String prop3) {}
}
在我的測試客戶端,我這樣做,當然,因爲有相關的類型不匹配JsonMappingException
它不會在編譯時工作。
ObjectMapper m = new ObjectMapper();
m.getDeserializationConfig().addMixInAnnotations(MyPojo.class,MyPojoDeMixIn.class);
try { ArrayList<MyPojo> arrayOfPojo = m.readValue(response, MyPojo.class); }
catch (Exception e) { System.out.println(e) }
我知道我可以通過創建一個只有在它的ArrayList<MyPojo>
「響應」對象緩解這個問題,但我將不得不爲每一個類型我想回到創建這些有點無用之物。
我也在網上查看JacksonInFiveMinutes,但有一個可怕的時間瞭解有關Map<A,B>
的東西,以及它如何與我的問題。如果你不能說,我完全不熟悉Java,並且來自Obj-C背景。他們特別提到:
除了結合POJO和「簡單」類型外,還有一個額外的 變種:即結合通用(類型)的容器。 由於所謂的類型擦除 (由Java用於實現向後兼容的 方式的泛型),這種情況需要特殊處理,這可以防止您使用類似 Collection.class(不能編譯)的東西。
所以,如果你想將數據綁定到一個地圖,你將需要使用:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
我怎麼能直接反序列化ArrayList
?
你的回答似乎與他們的信息如何使用內置的'TypeReference'支持 - 我只是不明白怎麼辦呢?請參閱上面就如何指導我的編輯使用泛型。 – 2012-03-22 20:04:14
嗯,它是相關的。但這是生產中代碼的一個片段。忘記你的mixin,只需使用我所展示的代碼(但是用當前實際bean類的名稱替換POJO)。 – Perception 2012-03-22 20:07:39
您的代碼已編譯,但在嘗試打印出關於「NullPointerException」的'arrayList.toString()'時出現運行時異常。我猜測這可能是因爲我的POJO不符合其屬性的正確命名約定,也就是說,整個問題是Web服務返回Prop1Member而我的對象有Prop1。這是我使用mixins開始的唯一真正原因,所以我不必將'@ JsonProperty'的聲明放在我的純對象中。 – 2012-03-22 20:19:03