通用反序列化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

回到顶部