Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSON如何反序列化数组?_Java_Json_Jackson - Fatal编程技术网

Java JSON如何反序列化数组?

Java JSON如何反序列化数组?,java,json,jackson,Java,Json,Jackson,我正在使用fasterxml.jackson。我对readValue()感到困惑。这是我的问题 我知道jackson用两种不同的方式反序列化普通JavaBean和集合。 对于JavaBean,我们可以将MyBean.class或newtypereference传递给readValue()。对于集合,我们必须传递新的TypeReference。这是因为TypeReference保存由集合擦除的类型。我说得对吗?:) 现在我很困惑。如果MyBean包含一个列表,那么我仍然可以传递MyBean.cla

我正在使用fasterxml.jackson。我对
readValue()
感到困惑。这是我的问题

我知道jackson用两种不同的方式反序列化普通JavaBean和集合。 对于JavaBean,我们可以将
MyBean.class
newtypereference
传递给
readValue()
。对于集合,我们必须传递
新的TypeReference
。这是因为
TypeReference
保存由集合擦除的类型。我说得对吗?:)

现在我很困惑。如果
MyBean
包含一个列表,那么我仍然可以传递
MyBean.class
,并且它可以工作。杰克逊是怎么做到的

public class MyBean {
    String str;
    List<String> strList;
}
公共类MyBean{
字符串str;
列表strList;
}

您正在将
MyBean.class
作为第二个参数传递给
readValue()
,Jackson可以通过反射从中获取类型。我猜杰克逊是这样做的:

MyBean.class.getDeclaredField("strList").getGenericType();
这将导致一种类型的
java.util.List

请注意,您有一个非泛型的
类MyBean
,其中包含一个
列表
。例如,如果您有:

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

将返回
java.util.List
,您需要一个
TypeReference

您正在传递
MyBean.class
作为
readValue()
的第二个参数,Jackson可以通过反射从中获取类型。我猜杰克逊是这样做的:

MyBean.class.getDeclaredField("strList").getGenericType();
这将导致一种类型的
java.util.List

请注意,您有一个非泛型的
类MyBean
,其中包含一个
列表
。例如,如果您有:

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

将返回
java.util.List
,并且需要
TypeReference

strList字段的泛型类型可以使用反射。但是在Java中不能将
List.class
作为参数传递。仅
List.class
。也许这个链接可以帮助您我的问题是:我认为JSON无法反序列化列表,因为类型为erase。这就是为什么我们必须传递TypeReference。但如果JavaBean包含List,JSON如何在运行时知道它的泛型呢?strList字段的泛型类型可以通过反射获得。但是在Java中不能将
List.class
作为参数传递。仅
List.class
。也许这个链接可以帮助您我的问题是:我认为JSON无法反序列化列表,因为类型为erase。这就是为什么我们必须传递TypeReference。但若JavaBean包含List,JSON在运行时如何知道它的泛型呢?