gpt4 book ai didi

java - Caused by : java. lang.ClassCastException : libcore. reflect.ParameterizedTypeImpl cannot be cast to java.lang.Class when use Generic Type 问题

转载 作者:太空狗 更新时间:2023-10-29 13:15:36 28 4
gpt4 key购买 nike

我创建了一个类扩展 AsyncTask 以使用 Gson 解析 Json,因为输入可以是多种类型的类,我使用泛型类型:

public class ApiResponse<T> extends AsyncTask...

我需要知道 T 的类类型来传递 Gson:

(1)

Class<T> clazz =
(Class<T>)((ParameterizedType)
getClass().getGenericSuperclass())
.getActualTypeArguments()[0];

new Gson().fromJson(reader, clazz);

但是,这里的 T 可以是一个有很多类型的类,所以有时我会通过类:

(2)

public class DataMessage<T> implements Serializable{...}

对于这些具有这种格式的类,我收到了由以下原因引起的异常:

java.lang.ClassCastException: libcore.reflect.ParameterizedTypeImpl 无法转换为 java.lang.Class

在 (1)

在这种情况下我该怎么办?

更新:

public class DataMessage<T> implements Serializable{

@SerializedName("pagination")
private Pagination pagination;
@SerializedName("meta")
private Message meta;
@SerializedName("data")
private T data;

public DataMessage(T data) {
this.data = data;
}

public Pagination getPagination() {
return pagination;
}

public void setPagination(Pagination pagination) {
this.pagination = pagination;
}

public Message getMeta() {
return meta;
}

public void setMeta(Message meta) {
this.meta = meta;
}

public T getData() {
return data;
}

public void setData(T data) {
this.data = data;
}

public class Pagination {
@SerializedName("next_max_tag_id")
public String nextMaxTagId;
@SerializedName("deprecation_warning")
public String deprecationWarning;
@SerializedName("next_max_id")
public String nextMaxId;
@SerializedName("next_min_id")
public String nextMinId;
@SerializedName("min_tag_id")
public String minTagId;
@SerializedName("next_url")
public String nextUrl;
}

public class Message {
@SerializedName("error_type")
public String errorType;
@SerializedName("code")
public int code;
@SerializedName("error_message")
public String error_message;
}
}

最佳答案

当我需要使用 Gson 解析带有特定类的 JSON 时,我使用 GsonBuilder 这种方式

GsonBuilder gsonBuilder = new GsonBuilder();

gsonBuilder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
try{
return new Date( json.getAsJsonPrimitive().getAsLong()*1000L );
}catch( Exception e ){
return null;
}

}
});

Gson gson = gsonBuilder.create();

在您的情况下,我认为您可以通过这种方式简单地解析您的 JSON:

DataMessage<YourClass> dataMessage = gson.fromJson(yourJsonObj, DataMessage.class);

还有一点就是可以通过这种方式获取到准确的Type

Type collectionType = new TypeToken<DataMessage<T>>() {}.getType();

但是当你反序列化这个时,你可能会得到一个糟糕的 Json...

最好的方法是使用类而不是 T,这样 Gson 就知道什么必须序列化/反序列化

Type collectionType = new TypeToken<DataMessage<YourClass>>() {}.getType();

我为你找到了这个 Deserializing Generic Types with GSON

关于java - Caused by : java. lang.ClassCastException : libcore. reflect.ParameterizedTypeImpl cannot be cast to java.lang.Class when use Generic Type 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35008795/

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