[英]GSON deserialize with passed generics
我正在為JSON映射庫工作一個簡單的外觀。 對於我的默認實現,我使用的是GSON,但遇到了一個問題。 我已經定義了一個類似於這樣的類:
public class QueryResult<T> {
private List<T> results;
private String nextOffset;
public List<T> getResults() { return results; }
public void setResults(List<T> results) { this.results = results; }
public String getNextOffset() { return nextOffset; }
public void setNextOffset(String nextOffset) { this.nextOffset = nextOffset; }
}
並希望用它做這樣的事情:
public <T> QueryResult<T> fromJsonQuery(String string, Class<T> clazz) {
Type type = new TypeToken<QueryResult<T>>() {}.getType();
return gson.fromJson(string, type);
}
但是,每當我調用此方法時,我都會收到錯誤:
QueryResult<Foo> qr = mapper.fromJsonQuery(json, Foo.class);
for (Foo foo : qr.getResults()) {
System.out.println(foo.toString());
}
java.lang.ClassCastException: com.google.gson.internal.StringMap cannot be cast to example.Foo
任何幫助將不勝感激。 謝謝。
我想出了一個對我有用的解決方案。 基本上,我定義了為我需要的各種類型擴展QueryResult的內部類。 在我的門面我定義了這個方法:
public <T> T fromJson(String string, Class<T> clazz) {
return gson.fromJson(string, clazz);
}
然后我可以做以下工作:
public class Main {
class FooQuery extends QueryResult<Foo> {}
public static void main(String[] args) {
Mapper mapper = new GsonMapper();
String json = args[0];
QueryResult<Foo> qr = mapper.fromJson(json, FooQuery.class);
for (Foo foo : qr.getResults()) {
System.out.println(foo.toString());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.