2017-05-28 104 views
1

我正在使用fasterxml.jackson。我很困惑readValue()。這是我的問題。JSON如何反序列化數組?

我知道傑克遜以兩種不同的方式反序列化普通的JavaBean和Collection。 對於JavaBean,我們可以通過MyBean.classnew TypeReference<MyBean>readValue()。對於收藏品,我們必須通過new TypeReference<List<MyBean>>。這是因爲TypeReference保存了Collection刪除的類型。我對嗎? :)

現在我很困惑。如果MyBean包含一個列表,那麼我仍然可以通過MyBean.class,它的工作原理。傑克遜如何做到這一點?

public class MyBean { 
    String str; 
    List<String> strList; 
} 
+0

strList字段的泛型類型可以使用反射。但是你不能在Java中傳遞'List .class'作爲參數。只有'List.class'。 –

+0

也許這個鏈接幫助你https://stackoverflow.com/a/6349488/6296931 –

+0

我的問題是:我認爲JSON不能反序列化List,因爲類型擦除。這就是爲什麼我們必須通過TypeReference。但是如果Java Bean包含List ,那麼JSON如何在運行時知道它的泛型? – zchen

回答

0

你傳入MyBean.class作爲第二個參數readValue()和傑克遜可以從這個經過反射獲取類型。我想傑克遜做這樣的事情:

MyBean.class.getDeclaredField("strList").getGenericType(); 

這將導致java.util.List<java.lang.String>類型。

請注意,您有一個非通用class MyBean包含List<String>。如果您有例如:

class MyGenBean<T> { 
    List<T> list; 
} 

然後

MyGenBean.class.getDeclaredField("list").getGenericType(); 

將返回java.util.List<T>,你會需要一個TypeReference