Java Gson ClassCastException(LinkedTreeMap)
使用Java Gson ClassCastException(LinkedTreeMap),java,json,gson,classcastexception,Java,Json,Gson,Classcastexception,使用Gson对参数化类容器的对象进行反序列化,会导致java.lang.ClassCastException的某些值T,例如,对于由字符串和列表字段组成的简单记录类型: com.google.gson.internal.LinkedTreeMap cannot be cast to Record 有趣的是,在内联调用fromJson()方法时,同样的代码也可以工作,即以下语句确实返回有效值: Container<Record> value = new Gson().fromJson
Gson
对参数化类容器的对象进行反序列化,会导致java.lang.ClassCastException
的某些值T
,例如,对于由字符串和列表字段组成的简单记录
类型:
com.google.gson.internal.LinkedTreeMap cannot be cast to Record
有趣的是,在内联调用fromJson()
方法时,同样的代码也可以工作,即以下语句确实返回有效值:
Container<Record> value = new Gson().fromJson(
json, new TypeToken<Container<Record>>(){}.getType());
Container value=new Gson().fromJson(
json,新的TypeToken(){}.getType());
容器的定义也很简单:
public class Container<T> {
private static final Gson PARSER = new Gson();
private String id;
private List<T> content;
private Object data;
public static <T> Container<T> deserialize(String json, Class<T> type) {
return PARSER.fromJson(json, new TypeToken<Container<T>>(){}.getType());
}
}
公共类容器{
私有静态最终Gson解析器=new Gson();
私有字符串id;
私有列表内容;
私有对象数据;
公共静态容器反序列化(字符串json,类类型){
返回PARSER.fromJson(json,newTypeToken(){}.getType());
}
}
将反序列化()
方法更改为非静态不会解决此问题
有什么想法吗?要参数化键入我的解决方案是创建
public static <T> Container<T> deserialize(String json, Class<T> clazz) {
Type type = TypeToken.getParameterized(Container.class,clazz).getType();
return new Gson().fromJson(json, type);
}
还有我的容器
public class ContainerRecord extends Container<Record> {
}
public class Container<T> {
public String id;
public List<T> content;
public Object data;
public static <T> Container<T> deserializeClass(String json, Class<? extends Container<T>> type) {
return new Gson().fromJson(json, type);
}
public static <T> Container<T> deserializeType(String json, Type type) {
return new Gson().fromJson(json, type);
}
public static <T> Container<T> deserialize(String json, Class<T> clazz) {
Type type = TypeToken.getParameterized(Container.class,clazz).getType();
return new Gson().fromJson(json, type);
}
}
公共类ContainerRecord扩展了容器{
}
和容器
public class ContainerRecord extends Container<Record> {
}
public class Container<T> {
public String id;
public List<T> content;
public Object data;
public static <T> Container<T> deserializeClass(String json, Class<? extends Container<T>> type) {
return new Gson().fromJson(json, type);
}
public static <T> Container<T> deserializeType(String json, Type type) {
return new Gson().fromJson(json, type);
}
public static <T> Container<T> deserialize(String json, Class<T> clazz) {
Type type = TypeToken.getParameterized(Container.class,clazz).getType();
return new Gson().fromJson(json, type);
}
}
公共类容器{
公共字符串id;
公开列表内容;
公共对象数据;
公共静态容器反序列化类(字符串json,类您想要参数化类型我的解决方案是创建
public static <T> Container<T> deserialize(String json, Class<T> clazz) {
Type type = TypeToken.getParameterized(Container.class,clazz).getType();
return new Gson().fromJson(json, type);
}
还有我的容器
public class ContainerRecord extends Container<Record> {
}
public class Container<T> {
public String id;
public List<T> content;
public Object data;
public static <T> Container<T> deserializeClass(String json, Class<? extends Container<T>> type) {
return new Gson().fromJson(json, type);
}
public static <T> Container<T> deserializeType(String json, Type type) {
return new Gson().fromJson(json, type);
}
public static <T> Container<T> deserialize(String json, Class<T> clazz) {
Type type = TypeToken.getParameterized(Container.class,clazz).getType();
return new Gson().fromJson(json, type);
}
}
公共类ContainerRecord扩展了容器{
}
和容器
public class ContainerRecord extends Container<Record> {
}
public class Container<T> {
public String id;
public List<T> content;
public Object data;
public static <T> Container<T> deserializeClass(String json, Class<? extends Container<T>> type) {
return new Gson().fromJson(json, type);
}
public static <T> Container<T> deserializeType(String json, Type type) {
return new Gson().fromJson(json, type);
}
public static <T> Container<T> deserialize(String json, Class<T> clazz) {
Type type = TypeToken.getParameterized(Container.class,clazz).getType();
return new Gson().fromJson(json, type);
}
}
公共类容器{
公共字符串id;
公开列表内容;
公共对象数据;
公共静态容器反序列化类(字符串json,ClassI已经用这个json
:{“id”:“32874394djs”,“content”:[{“name”:“ABC”,“labels”:[“a”,“b”,“c”]}],“data”:“Extra data”}
其中记录包含名称
和标签
列表。我将其序列化为JSON
,并使用new TypeToken(){}.getType()正确反序列化回来
类型。你能发布你的JSON
和记录
类吗?现在不可能重新创建这个bug。从另一方面来说,在POJO
类中将解析器
存储为静态字段听起来不是个好主意。它们应该分开。请阅读“如何创建一个”。然后使用该链接改进您的问题(不要通过评论添加更多信息)。否则,我们无法回答您的问题并帮助您。我已使用此JSON
:{id:“32874394djs”,“content:[{”name:“ABC”,“labels:[“a”,“b”,“c”]}],“data:“Extra data”}测试了此代码
其中记录包含名称
和标签
列表。我将其序列化为JSON
,并使用new TypeToken(){}.getType()正确反序列化回来
类型。你能发布你的JSON
和记录
类吗?现在不可能重新创建这个bug。从另一方面来说,在POJO
类中将解析器
存储为静态字段听起来不是个好主意。它们应该分开。请阅读“如何创建一个”。然后使用该链接改进您的问题(不要通过评论添加更多信息)。否则,我们将无法回答您的问题并为您提供帮助。