通用反序列化Gson类型令牌问题
我发现了很多类似的问题,但没有一个帮助过。通用反序列化Gson类型令牌问题
这工作:
public class Assets<T> { public T getAndDeserializeAsset(String endpoint, String assetId, Client client){
Response response = client.get(endpoint+assetId);
Gson gson = new Gson();
T asset = gson.fromJson(response.body, new TypeToken<Email>(){}.getType());
return asset;
}
}
这不:
public class Assets<T> { public T getAndDeserializeAsset(String endpoint, String assetId, Client client){
Response response = client.get(endpoint+assetId);
Gson gson = new Gson();
T asset = gson.fromJson(response.body, new TypeToken<T>(){}.getType());
return asset;
}
}
我已经根据官方文档做了,所以我不知道为什么它不起作用。
错误:
Exception in thread "main" java.lang.ClassCastException: com.rest.api.Response cannot be cast to model.Email at main.Main.main(Main.java:34)
回答:
有意义的是,你的Assets<T>
实例必须是不Assets<Email>
的Assets<Response>
一个实例,唯一的事情。您是否确定您的Assets
实例是正确的类型?
另外,请记住,Gson不协变;当您使用TypeToken
指定类型时,您必须使用您想要反序列化的确切类型。例如,如果您使用的类定义:
class Email extends Response {
,然后使用:
new Assets<Response>();
因为GSON是不是协变,也没有办法知道你真正想要的是一个Email
。
回答:
上面的代码无法将值解释为类型,因为Gson调用Assets.getClass()以获取其类信息,但此方法返回一个原始类Assets.class。这意味着Gson无法知道这是一个类型为Assets < Example>的对象,而不仅仅是简单的Assets。
您可以通过为泛型指定正确的参数化类型来解决此问题。您可以通过使用TypeToken类来完成此操作。
Type AssetsType = new TypeToken<Assets<Example>>() {}.getType(); gson.toJson(assets, AssetsType);
gson.fromJson(json, AssetsType);
的更多信息,请gson-user-guide
以上是 通用反序列化Gson类型令牌问题 的全部内容, 来源链接: utcz.com/qa/265879.html