Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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/15.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 Gson ClassCastException(LinkedTreeMap)_Java_Json_Gson_Classcastexception - Fatal编程技术网

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
类中将
解析器
存储为静态字段听起来不是个好主意。它们应该分开。请阅读“如何创建一个”。然后使用该链接改进您的问题(不要通过评论添加更多信息)。否则,我们将无法回答您的问题并为您提供帮助。