Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> [Android開發] Json解析工具類,一個類搞定Json的解析

[Android開發] Json解析工具類,一個類搞定Json的解析

編輯:關於Android編程

一、簡介

利用遞歸的方式反射解析到bean裡面

二、詳細代碼

1、 Json格式

例如服務器指定規定json格式為:

{
    "code": "……" ,      // 返回代號,預留字段,默認返回null
    "type":"ERROR",     // 返回類型,表示操作是成功或失敗
    "desc":"……",        // 返回描述,描述性文字,主要保存用於彈窗顯示的文字
    "action":"SHOW",   //返回操作,該操作值提供給終端使用,用於決定當前收到返回後的操作
    "data": "……"        // 返回數據,根據請求上傳的參數,返回對應的數據,或返回null
}

對應的數據在data裡面,data裡面的key對應一個bean,例如一個列表數據:

{
    "desc":"查詢成功",
    "data":{
        "diseaseList":[
            {
                "xmlName":"精神病評估",
                "xmlId":"1066",
                "category":"symptom"
            },
            {
                "xmlName":"對學習困難和認知延遲的評估",
                "xmlId":"884",
                "category":"symptom"
            },
            {
                "xmlName":"疲乏的評估",
                "xmlId":"571",
                "category":"symptom"
            },
            {
                "xmlName":"癡呆的評估",
                "xmlId":"242",
                "category":"symptom"
            },
            {
                "xmlName":"非故意性體重減輕評估",
                "xmlId":"548",
                "category":"symptom"
            }
        ]
    },
    "action":null,
    "code":"",
    "type":"SUCCESS"
}

2、定義數據Bean類

上面的list的bean定義為DiseaseList.java

public class DiseaseList  {


    /**
     * xmlName : 分裂情感性障礙
     * xmlId : 1199
     * category : disease
     */

    private String xmlName;     //症狀名字
    private String xmlId;       //症狀名字
    private String category;    //分類的 英文名

    private String letter = ""; //字母,轉為拼音後在這裡添加

    public String getXmlName() {
        return xmlName;
    }

    public void setXmlName(String xmlName) {
        this.xmlName = xmlName;
    }

    public String getXmlId() {
        return xmlId;
    }

    public void setXmlId(String xmlId) {
        this.xmlId = xmlId;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }


    public String getLetter() {
        return letter;
    }

    public void setLetter(String letter) {
        this.letter = letter;
    }
}

3、定義根key的bean類

Response.java:

/**
 * json返回的首key的內容類
 * 
 */
public class Response {

    //下面四個是固定寫在第一層的
    private String code;
    private String type;
    private String desc;
    private String action;


    //Object 可以存放list
    private HashMap datas = new HashMap();   //存放對象(一般是list),根據String這個id來取

    //存放data裡面的基本類型
    private HashMap dataValue = new HashMap<>();

    public Response() {

        code = type = desc = action /*= version = token = applyAuthenticateId*/ = "";

    }


    public final static String TOKEN = "token";
    public final static String VERSION = "version";
    public final static String PORTRAIT = "portrait";
    public final static String USERID = "userId";
    public final static String APPLYAUTHENTICATEID = "applyAuthenticateId";
    public final static String ISDOCTOR = "isDoctor";
    public final static String ISEXPERT = "isExpert";

    public final static String WAY = "way";
    public final static String DOWNLOAD = "download";



    /**
     * 存值到hashmap裡面
     * @param key
     * @param value
     */
    public void put(String key, Object value) {
        datas.put(key, value);
    }

    /**
     * 獲取key對應的對象
     * @param key key
     * @param  返回的對象
     * @return  hashMap的key對應的值
     */
    public  T get(String key){

        if(datas.containsKey(key)){
            return (T)datas.get(key);
        }

        return null;
    }


    /**
     * 反射執行,添加到hashMap,data裡面的基本類型數據
     * @param key
     * @param value
     */
    public void addDataValue(String key, Object value){

        dataValue.put(key,value);
    }

    /**
     * 獲取data裡面的基本類型數據
     * @param key
     * @param 
     * @return
     */
    public  T getDataValue(String key){
        if(dataValue.containsKey(key)){
            return (T)dataValue.get(key);
        }

        return null;
    }



    public String getCode() {
        return code;
    }

    public void setCode(String code) {

        if(null != code && !"".equals(code.trim()))
            this.code = code;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        if(!TextUtils.isEmpty(desc))
            this.desc = desc;
    }


}

4、定義反射類枚舉

json解析時候根據key在這裡獲取到對應的類實例
DATA.java:

/**
 * json解析的時候的類
 */
public enum DATA {

    //疾病列表
    DISEASELIST("diseaseList",DiseaseList.class)

    ;

    private final String mId;

    private final Class cls;

    public Class getClzss() {
        return cls;
    }

    DATA(String id, Class clzss) {
        mId = id;
        cls = clzss;
    }

    /**
     * 根據json的key獲取類
     * @param id
     * @return
     */
    public static DATA fromId(String id) {

        DATA[] values = values();
        int cc = values.length;

        for (int i = 0; i < cc; i++) {
            if (values[i].mId.equals(id)) {
                return values[i];
            }
        }

        return null;
    }

    @Override
    public String toString() {
        return mId;
    }
}

5、 Json解析工具類

對應的注釋已經寫到代碼裡面了
JsonResolveUtils.java

/**
 * json解析工具類
 */
public class JsonResolveUtils {

    private static final String SET = "set";
    private static final String PUT = "put";

    /**
     * 開始解析json 字符串,解析為Response類bean形式
     *
     * @param response json字符串
     * @param cls      Response類class
     * @param       泛型,這裡傳遞了Response
     * @return
     */
    public static  T parseJsonToResponse(String response, Class cls) {

        if (null != response) {

            try {
                // 構建JSONObject 實例
                JSONObject json = new JSONObject(response);
                // JSONObject 解析成具體Bean實例
                T entity = toResponse(json, cls);

                return entity;

            } catch (JSONException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * JSONObject解析成Response Bean實例
     *
     * @param json json對象
     * @param cls  轉換的對象,這裡是Response
     * @param   轉換的對象,這裡是Response
     * @return 返回Response對象
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static  T toResponse(JSONObject json, Class cls) throws IllegalAccessException, InstantiationException {

        //聲明一個Response實例
        T instance = null;

        if (null != json) {
            // 獲取根key
            Iterator iterator = json.keys();
            //構建個實例Response Bean
            instance = cls.newInstance();
            //開始遍歷根 key
            while (iterator.hasNext()) {

                try {
                    String key = iterator.next();  //獲取key
                    Object value = json.get(key);  //獲取key對應的值
                    //值不為空
                    if (null != value) {

                        if (!key.equals("data")) {
                            //不是data數據,直接為Response的Bean屬性賦值
                            setter(instance, key, value);

                        } else {  // 解析data數據

                            if (value instanceof JSONObject) {
                                //data 數據是JSONObject 開始解析json對象數據
                                parseJsonBean((JSONObject) value, instance);
                            } else if (value instanceof JSONArray) {
                                //data 數據是JSONArray 開始解析json數組數據
                                toBeanArray((JSONArray) value, instance);
                            } else {
                                //若都不是,直接為ResponseBean屬性賦值
                                setter(instance, key, value);
                            }
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } // while(~)
        }
        return instance;
    }

    /**
     * 解析單個JSON數據
     *
     * @param json     json
     * @param instance Bean實例
     * @param 
     */
    public static  void parseJsonBean(JSONObject json, T instance) {
        //json不為空
        if (null != json) {
            //獲取json的key iterator
            Iterator iterator = json.keys();

            while (iterator.hasNext()) {

                //獲取鍵值對
                String key = iterator.next();
                Object value = null;
                try {
                    //獲取值
                    value = json.get(key);
                    //value不為空
                    if (null != value) {
                        // value 為json對象 則把json解析成具體的實例Bean
                        if (value instanceof JSONObject) {

                            // 獲取對應的實例Bean Class
                            DATA clzss = DATA.fromId(key);
                            //不為空
                            if (null != clzss) {
                                //把json解析成該實例Bean
                                Object entity = toBean((JSONObject) value, clzss.getClzss());
                                //把當前Bean類緩存在上級Bean屬性裡
                                putter(instance, entity.getClass(), key, entity);
                            }
                        } else if (value instanceof JSONArray) { //value 為json 數據對象,則把jsonarray解析成ArrayList
                            // 獲取對應的實例Bean Class
                            DATA clzss = DATA.fromId(key);
                            if (null != clzss) {
                                //把json解析成ArrayList
                                Object entity = parseBeanArray((JSONArray) value, clzss.getClzss());
                                //把當前ArrayList緩存在上級Bean屬性裡
                                putter(instance, entity.getClass(), key, entity);
                            }
                        } else {
                            //都是不是,直接為上級Bean屬性賦值
                            if (instance instanceof Response) {
                                //dada下面的標准類型的值設置進Respone的dataString
                                setDataString(instance,key, value.toString());
                            } else {
                                putter(instance, value.getClass(), key, value);
                            }
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 設置Response的dataString
     *
     * @param obj
     * @param key
     * @param value
     * @param 
     */
    private static   void setDataString(Object obj, String key, String value) {
        //值不為空
        if (null == value)
            return;

        try {
            //獲取addDataString方法,參數1 為方法名,2為類型
            Method method = obj.getClass().getMethod("addDataValue", String.class, Object.class);
            //調用set方法賦值
            method.invoke(obj, key, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 解析JSON成具體實例Bean
     *
     * @param json json數據
     * @param cls  要解析成為的實例
     * @param   返回實例
     * @return
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static  T toBean(JSONObject json, Class cls) throws IllegalAccessException, InstantiationException {
        //聲明實例引用
        T instance = null;
        //json不為空
        if (null != json) {
            //獲取json key 的迭代器;
            Iterator iterator = json.keys();
            //構建實例Bean
            instance = cls.newInstance();
            //遍歷json key
            while (iterator.hasNext()) {
                //獲取鍵值對
                String key = iterator.next();
                Object value = null;
                try {
                    value = json.get(key);
                    //value不為空
                    if (null != value) {
                        // value 為json對象 則把json解析成具體的實例Bean
                        if (value instanceof JSONObject) {
                            // 獲取對應的實例Bean Class
                            DATA clzss = DATA.fromId(key);
                            if (null != clzss) {
                                //把json解析成該實例Bean
                                Object entity = toBean((JSONObject) value, clzss.getClzss());
                                //把當前Bean類緩存在上級Bean屬性裡
                                putter(instance, entity.getClass(), key, entity);
                            }
                        } else if (value instanceof JSONArray) { //value 為json數組對象,則把jsonarray解析成ArrayList
                            // 獲取對應的實例Bean Class
                            DATA clzss = DATA.fromId(key);
                            if (null != clzss) {
                                //把json解析成ArrayList
                                Object entity = parseBeanArray((JSONArray) value, clzss.getClzss());
                                //把當前ArrayList緩存在上級Bean屬性裡
                                putter(instance, entity.getClass(), key, entity);
                            }
                        } else {
                            //都是不是,直接為上級Bean屬性賦值
                            setter(instance, key, value);
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return instance;
    }

    /**
     * 解析json裡面的json數組,例如專家列表
     *
     * @param jsonarr
     * @param cls
     * @param 
     * @return
     */
    public static  ArrayList

三、使用

例如第一個數據獲取到list數據

        //解析為response
        Response response = JsonResolveUtils.parseJsonToResponse(json,Response.class);

從response裡面獲取list數據
List list = new ArrayList<>();

//獲取完成開始解析為list bean
        Response response = JsonResolveUtils.parseJsonToResponse(json,Response.class);

        ArrayList cache = null;
        cache = response.get(DATA.DISEASELIST.toString());
        if(cache != null && !cache.isEmpty()){
            //添加到list
            list.addAll(cache);
            Log.e("tpnet",list.size()+"個數據");
        }else{
            //獲取數據失敗操作
        }

四、使用注意

解析的時候是根據返回的格式進行解析的,如果有數字類型的數據。在bean裡面應該寫完整幾種類型的數字,例如金額:

public class FinanceRecords {


    private String sum;       //金額

    public String getSum() {
        return sum;
    }

    //添加下面四種類型供json反射回調

    public void setSum(String sum) {
        this.sum = sum;
    }

    public void setSum(Integer sum) {
        this.sum = sum+"";
    }

    public void setSum(Float sum) {
        this.sum = sum+"";
    }

    public void setSum(Double sum) {
        this.sum = sum+"";
    }

}

下一篇文章有一個完整的demo。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved