当前位置: 首页 > 面试题库 >

使用Gson将Json解析为具有通用字段的项目列表

顾靖
2023-03-14
问题内容
public class OwnCollection<T>{
    private int size;
    private List<ResponseItem<T>> data;
}

public class ResponseItem<T>{
    private String path;
    private String key;
    private T value;
}

public class Query{
    public <T> OwnCollection<T>  getParsedCollection( ... ){
        String json = ...; //some unimportant calls where I get an valid Json to parse
        return Result.<T>parseToGenericCollection(json);
    }
}

public class Result{
    public static <T> OwnCollection<T> parseToGenericCollection(String result){
        Type type = new TypeToken<OwnCollection<T>>() {}.getType();
        //GsonUtil is a class where I get an Instance Gson, nothing more.
        return GsonUtil.getInstance().fromJson(result, type);
    }
}

现在我怎么称呼它:

OwnCollection<Game> gc = new Query().<Game>getParsedCollection( ... );

结果,我想,我将得到一个OwnCollectionList<ResponseItem>其中一个Response
Item包含class的字段Game。Json非常好,没有解析错误,现在唯一的问题是当我尝试获取一项Game并调用方法时出现此错误:

Exception in thread "main" java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to at.da.example.Game

问题答案:

这样行不通,因为以下代码

OwnCollection<Game> gc = new Query().<Game>getParsedCollection( ... );

实际上并没有通过Game内部getParsedCollection()<Game>这里只告诉getParsedCollection()应该返回的编译器OwnCollection<Game>,但是T内部getParsedCollection()(和parseToGenericCollection())仍然被擦除,因此TypeToken无法帮助您获取其值。

您需要改为Game.class作为参数传递

public <T> OwnCollection<T> getParsedCollection(Class<T> elementType) { ... }
...
OwnCollection<Game> gc = new Query().getParsedCollection(Game.class);

然后用TypeToken链接OwnCollectionTelementType如下:

Type type = new TypeToken<OwnCollection<T>>() {}
    .where(new TypeParameter<T>() {}, elementType)
    .getType();

请注意,此代码用于TypeTokenGuava,因为TypeToken来自Gson的代码不支持此功能。



 类似资料:
  • 问题内容: 我的样子如下: 现在,每个元素具有相同的结构(假设一个POJO称为MessageDefault.java)。那么我怎么能把所有东西都当作一个??呢? 我正在使用gson进行解析。我也不能更改JSON响应。 编辑:: MessageDefault.java 它只是一切的结构。但是在JSON中,的每个子项都有不同的名称,例如POJO MessageDefault.java中所反映的名称。但

  • 我是JSON的新手,与我研究过的任何其他解析方法相比,我喜欢GSON Api的强大和直截了当。 我想解析一个相当复杂的JSON(使用GSON),就结构而言,它类似于下面的JSON: 我哪里出了问题? 是否有一种创建我所缺少的类的特殊方法? 注意:从结构的角度来看,我的JSON对象是完全有效的。如果您看到任何错误,这可能是因为当我手动创建上面的虚拟/演示时,它们出现了滑动。

  • 问题内容: 因此,我使用GSON来从API解析JSON,并被困在如何解析数据中的动态字段上。 这是查询返回的JSON数据的示例: 我当前处理单个静态值的方式是使用一个类: 然后我可以简单地使用GSON来解析它: 我知道这对子数据有效,因为我可以查询并获得单个条目并非常轻松地解析该条目,但是为数组中每个值给出的随机整数值呢?(即30655845和2868874) 有什么帮助吗? 问题答案: 根据GS

  • 问题内容: 我有一个名为包含以下内容: 我知道我可以用以下方法获得阵列: 现在我想将其解析为… 最简单的方法是什么? 问题答案: 绝对最简单的方法是使用Gson的默认解析功能。 此功能的实现适用于需要反序列化为任何(例如any )的情况。 在您的情况下,您只需要获取的,然后将JSON数组解析为that ,如下所示: 在您的情况下是a ,但也可能是a ,any 或a 。 您可能需要看一下Gson A

  • 问题内容: 我有一个像这样的JSON对象: 并尝试与Gson解析: 但是“ responceBean”始终为“ null” 这是所有其他类: 这是我的最新尝试。我不知何故找不到正确的方法。任何帮助将不胜感激。 问题答案: 您的 JSON模型与您的对象模型不匹配 。 您需要一个中间层来填补空白: TypeAdapter 。 而且,没有用户的命名信息。 最后是名称不匹配:JSON中的“ worklog

  • 问题内容: 但是我无法从中得到答案。上面链接的答案: 它运作良好,但我想对泛型使用隐式运算符。见下文: 然后,我尝试将Class参数传递给方法: 然后出现一个错误: 谁能告诉我为什么会出现此错误?TypeToken类不支持隐式运算​​符吗? 问题答案: 您可以这样: