2017-05-28 102 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