在Android开发中,使用Gson将json字符串转换为Java对象尤为常见。在这个转换过程中,通常会结合泛型参数、接口或者抽象类来封装处理。
T t = new Gson().fromJson(response, type);
那如何来获取type呢?
接口实现
public interface ICallback<T> {
void onSuccess(T t);
void onFailure(String msg);
}
对于一个ICallback<T>类型的callback而言:
// 返回实现的接口
Type[] genericInterfaces = callback.getClass().getGenericInterfaces();
if (genericInterfaces[0] instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) (genericInterfaces[0]);
// 仅包含一个泛型参数
Type type = parameterizedType.getActualTypeArguments()[0];
// T为String
if (type instanceof Class && TextUtils.equals(((Class<?>) type).getName(), String.class.getName())) {
callback.onSuccess((T) response);
return;
}
try {
T t = new Gson().fromJson(response, type);
callback.onSuccess(t);
} catch (Exception e) {
callback.onFailure("解析失败");
}
}else {
// 无泛型参数
callback.onSuccess((T) response);
}
抽象类实现
public abstract class AbstractCallback<T> {
protected abstract void onSuccess(T t);
protected abstract void onFailure(String msg);
}
同样,对于一个AbstractCallback<T>类型的callback而言:
Type superclass = callback.getClass().getGenericSuperclass();
if (superclass instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) superclass;
// 仅包含一个泛型参数
Type type = parameterizedType.getActualTypeArguments()[0];
// T为String
if (type instanceof Class && TextUtils.equals(((Class<?>) type).getName(), String.class.getName())) {
callback.onSuccess((T) response);
return;
}
try {
T t = new Gson().fromJson(response, type);
callback.onSuccess(t);
} catch (Exception e) {
callback.onFailure("解析失败");
}
} else {
// 无泛型参数
callback.onSuccess((T) response);
}