记录:Convert LinkedTreeMap To CustomClass.

参考:https://stackoverflow.com/questions/38057172/how-do-i-convert-a-linkedtreemap-to-gson-jsonobject/38058135

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);
        }
    }
}

}

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值