package com.cheng.multithreadstudy.sunframework.http.HttpCallBack; import android.text.TextUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.Arrays; /** * 支持穿透解析 */ public abstract class AbstractParserCallBack<T> { private String[] mTitle; public AbstractParserCallBack(String... title) { this.mTitle = title; } public final void onSuccess(String stringResponseInfo) { try { parserResult(interceptParser(stringResponseInfo), mTitle); } catch (JSONException e) { onFailureCallBack(e); } } private T parserResult(String wrapString, String... title) { if (!TextUtils.isEmpty(wrapString)) { try { if (title == null || title.length == 0) { if (!onSuccessWithWrapString(wrapString)) { if (getCurrentClass() == String.class) { return (T) wrapString; } JSONObject wrapJsonObject = new JSONObject(wrapString); if (!onSuccessWithWrapJson(wrapJsonObject)) { // T t = JSON.parseObject(wrapString, getCurrentClass()); T t = null; onSuccessWithObject(t); return t; } } } else { JSONObject currentObject = new JSONObject(wrapString); return parserResult(currentObject.optString(title[0]), Arrays.copyOfRange(title, 1, title.length)); } } catch (JSONException e) { try { JSONArray jsonArray = new JSONArray(wrapString); if (title == null || title.length == 0) { // onSuccessWithObjectList(new ArrayList<T>(JSON.parseArray(wrapString, getCurrentClass()))); onSuccessWithObjectList(new ArrayList<T>()); } else { int length = jsonArray.length(); ArrayList<T> list = new ArrayList<>(length); for (int i = 0; i < length; i++) { T t = parserResult(jsonArray.getString(i), title); if (t != null) { list.add(t); } } onSuccessWithObjectList(list); } } catch (Exception e1) { onFailureCallBack(e1); } } } if (getCurrentClass() == String.class) { return (T) wrapString; } return null; } public final void onFailure(Exception e, String s) { onFailureCallBack(e, s); } private final void onFailureCallBack(Exception e) { onFailureCallBack(e, e == null ? "" : e.getMessage()); } protected void onFailureCallBack(Exception e, String msg) { } /** * 任意一个返回true 既不会再往下执行,解析传递到此结束。 * 当然可以中间拦截 返回false,继续执行. 除非解析到最后需要的节点 * 最后返回顺序为:String->JSON->Object或者String->List * * @param wrapString * @return */ protected boolean onSuccessWithWrapString(String wrapString) { return false; } protected boolean onSuccessWithWrapJson(JSONObject jsonObject) { return false; } protected boolean onSuccessWithObject(T t) { return false; } protected boolean onSuccessWithObjectList(ArrayList<T> list) { return false; } protected abstract Class<T> getCurrentClass(); protected String interceptParser(String result) throws JSONException { return result; } }