https://stackoverflow.com/questions/32444863/google-gson-linkedtreemap-class-cast-to-myclass
Type beanType = new TypeToken<OListBean<T>>() {}.getType();
OListBean<T> listBean = new Gson().fromJson(dataStr, beanType);
ArrayList<T> beanArr = GSonUtil.getArr((ArrayList<LinkedTreeMap>) listBean.getList(), dataClass);
callBack.OnSuccess(msg,listBean.getTotalPages(),beanArr);
服务器返回数据结构:
{
"code":0,
"msg":"success",
"data"://有三种类型,1是直接的[],2是直接的{},3是嵌套类型的{a:String,b:int,c:[]}
}
我这的第3种如下:
{
totalCount:5,
totalPage:3,
pageSize:2,
pageIndex:1,
list:[
{}//custom class
{}
]
}
服务器总数据模型:
public class RequestResult implements Serializable {
public int code;
public String msg;
public JsonElement data;
}
//第3种数据类型结构
public class OListBean<Bean> implements Serializable {
private int totalCount;
private int totalPages;
private int pageIndex;
private int pageSize;
private ArrayList<Bean> list;
}
GSonUtil:
public class GSonUtil {
public static <T> T getObj(String jsonStr, Class<T> clazz) {
return new Gson().fromJson(jsonStr, clazz);
}
public static <T> ArrayList<T> getArr(ArrayList<LinkedTreeMap> maps, Class<T> clazz) {
ArrayList<T> list = new ArrayList<>();
for (LinkedTreeMap map : maps) {
list.add(getObj(new Gson().toJsonTree(map).getAsJsonObject().toString(), clazz));
}
return list;
}
public static <T> ArrayList<T> getArr(String json, Class<T> clazz) {
Type type = new TypeToken<ArrayList<JsonElement>>() {
}.getType();
ArrayList<JsonElement> jsonObjects = new Gson().fromJson(json, type);
ArrayList<T> arrayList = new ArrayList<>();
for (JsonElement jsonObject : jsonObjects) {
arrayList.add(new Gson().fromJson(jsonObject, clazz));
}
return arrayList;
}
}
private static boolean isNull(JsonElement element) {
return element == null || element.isJsonNull();
}
//网络请求回调
public abstract class IHttpCallBack<Bean> {
/**
* 用于返回data为{}类型
* true-直接Gson解析后返回{}
* false-解析为OListBean<Bean>
*/
public boolean directlyBean() {
return false;
}
public void OnSuccess(String msg, ArrayList<Bean> list) {
this.OnSuccess(msg, null, list);
}
public void OnSuccess(String msg, int totalPages, ArrayList<Bean> list) {
}
public void OnSuccessSingle(String msg, Bean model) {
}
public abstract void OnFailure(String msg);
}
//result为服务器返回数据结构的String
public void handleResult(String result){
RequestResult resultObj = GSonUtil.getObj(result, RequestResult.class);
int code = resultObj.code;
String msg = resultObj.msg;
if (code == M_HTTP_SUCCESS) {
//success
if (isNull(resultObj.data) ||
(resultObj.data.isJsonArray() && resultObj.data.getAsJsonArray().size() == 0)) {
//data null
callBack.OnSuccess(msg, null);
} else if (resultObj.data.isJsonArray()) {//解析第1种
//directly -> bean array
String dataArr = resultObj.data.toString();
if (dataClass == String.class) {
Gson gson = new Gson();
String[] array = gson.fromJson(dataArr, String[].class);
List<String> parseData = Arrays.asList(array);
ArrayList<String> rtnData = new ArrayList<>();
rtnData.addAll(parseData);
callBack.OnSuccess(msg, (ArrayList<T>) rtnData);
if (rtnData.size() == 1)
callBack.OnSuccessSingle(msg, (T) rtnData.get(0));
} else if (dataClass == Double.class) {
Gson gson = new Gson();
Double[] array = gson.fromJson(dataArr, Double[].class);
List<Double> parseData = Arrays.asList(array);
ArrayList<Double> rtnData = new ArrayList<>();
rtnData.addAll(parseData);
callBack.OnSuccess(msg, (ArrayList<T>) rtnData);
if (rtnData.size() == 1)
callBack.OnSuccessSingle(msg, (T) rtnData.get(0));
} else if (dataClass == Integer.class) {
Gson gson = new Gson();
Integer[] array = gson.fromJson(resultObj.data.toString(), Integer[].class);
List<Integer> parseData = Arrays.asList(array);
ArrayList<Integer> rtnData = new ArrayList<>();
rtnData.addAll(parseData);
callBack.OnSuccess(msg, (ArrayList<T>) rtnData);
if (rtnData.size() == 1)
callBack.OnSuccessSingle(msg, (T) rtnData.get(0));
} else {
ArrayList<T> list = GSonUtil.getArr(dataArr, dataClass);
callBack.OnSuccess(msg, list);
if (list.size() == 1)
callBack.OnSuccessSingle(msg, list.get(0));
}
} else {
//single bean
String dataStr = resultObj.data.toString();
if (callBack.directlyBean()) {//解析第2种
//directly return the bean
callBack.OnSuccessSingle(msg, GSonUtil.getObj(dataStr, dataClass));
} else {//解析第3种
//import java.lang.reflect.Type
//import com.google.gson.reflect.TypeToken;
Type beanType = new TypeToken<OListBean<T>>() {}.getType();
OListBean<T> listBean = new Gson().fromJson(dataStr, beanType);
ArrayList<T> beanArr = GSonUtil.getArr((ArrayList<LinkedTreeMap>) listBean.getList(), dataClass);
callBack.OnSuccess(msg,listBean.getTotalPages(),beanArr);
}
}
}
}