我把问题发错了。我把问题发在这里是正确的...
我得到一个json字符串作为HTTP响应,我知道它的结构,如下所示:
public class Json<T> {
public Hits<T> hits;
}
public class Hits<T> {
public int found;
public int start;
public ArrayList<Hit<T>> hit;
}
public class Hit<T> {
public String id;
public Class<T> data;
}
“data”字段可以属于任何类。我只会在运行时知道它。我会把它作为一个参数来获取。这就是我反序列化的方式。
public <T> void deSerialize(Class<T> clazz) {
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(jsonString, new TypeReference<Json<T>>() {});
}
但我收到一个错误-
无法从java.lang.class访问私有java.lang.class.Class()。无法设置访问权限。无法使java.lang.Class构造函数可访问
6条答案
按热度按时间xhv8bpkk1#
如果泛型类型仅动态可用,则需要显式构建
JavaType
:0g0grzrc2#
通用反序列化接口示例:
zwghvu4y3#
您正在将Class对象序列化和反序列化为JSON?也许可以在Hit中将其保留为String,并创建额外的getter来启动Class.forName,例如。
fslejnso4#
对我来说,类似的事情在类似的情况下也起过作用
8dtrkrch5#
需要反序列化的JSON字符串必须包含有关参数
T
的类型信息。您必须在每个类上放置Jackson注解,这些类可以作为参数
T
传递给类Json
,以便Jackson可以从JSON字符串读取参数类型T
的类型信息,也可以将其写入JSON字符串。让我们假设
T
可以是扩展抽象类Result
的任何类。当每个类(或者它们的公共超类型)都被标注为参数
T
时,Jackson会在JSON中包含参数T
的信息,这样就可以在编译时反序列化JSON,而不需要知道参数T
。这个Jackson documentation link讨论了多态反序列化,但对于这个问题也很有用。
dfty9e196#
反序列化泛型类变量
...
我该怎么跟Jackson说?杰森会做得更好吗?
Gson用户指南中有一节详细介绍了我所理解的您要实现的目标,尽管该文档示例可能还不完整。
在一篇博客文章中,我更详细地介绍了使用Gson 1.7.1的解决方案。
在同一篇博客文章中,还演示和描述了使用Jackson(1.8.2)的类似(但更复杂)解决方案(不同的方法和示例使用数百行代码,所以我在这里省略了重新发布它们)。