gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:21:28 26 4
gpt4 key购买 nike

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>其中一个响应项包含类 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无法帮助您捕捉它的值(value)。

您需要通过 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();

注意这段代码使用了 TypeToken from Guava ,因为 TypeToken来自 Gson 的不支持此功能。

关于java - 使用 Gson 将 Json 解析为具有通用字段的项目列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24505314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com