1. 程式人生 > >Android關於json解析,封裝簡易的工具類

Android關於json解析,封裝簡易的工具類

android中請求過來的資料,其實都是json字串,那麼如何解析json字串才是我們最應該關心的,我就把我在專案中最常用的分享出來,其他的可以自行擴充套件。
新建一個JsonUtil類,然後私有化構造方法,因為作為工具類,我們並不希望是通過例項化一個類才去實現功能的。
第一步:

public class JsonUtil {
    private JsonUtil(){}
}

第二步:瞭解JSONObject裡可以獲得哪幾種類型
JSONArray,JSONObject,Boolean,Double,int,Long,String
第三步:就是如何才能去使用上邊的型別,進行資料的解析,這也是最重要的。
首先新建一個方法,這個方法是可以例項化出JSONObject物件的,通過這個物件獲得其他的值,當然也可以直接例項化出JSONArray 物件,如果json字串是陣列型別的。

 public static JSONObject createJSONObject(String json) {
        try {
            JSONObject jsonObject = new JSONObject(json);
            return jsonObject;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
 public static JSONArray createJSONArray(String json){
        try {
            JSONArray jsonArray = new JSONArray(json);
            return jsonArray;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

第四步:獲取資料
看到通過JSONObject可以獲取那麼多的型別,我們要不要給每一個型別寫一個方法獲取資料呢?答案是No,其實java中的泛型是可以做到的,直接上程式碼

 public <T> T getParam(JSONObject jsonObject, String name) {
        try {
            return (T) jsonObject.get(name);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

僅僅幾行就可以了,根本不用考慮到型別的問題,這也是泛型的一種使用方式,只要你獲取的型別跟你想要的型別一致的話就沒問題,不然就會報李型別轉換異常,畢竟型別都不一樣怎麼會不報錯呢。
第五步:就是如何自動轉成想要的型別,其實每個人都有不同的解決方法,我用谷歌推出的Gson來進行類的解析的.

 //獲取資料
    public static <T> List<T> getParamList(JSONObject jsonObject, Class<T> clzz, String name) {
        try {
            String data = jsonObject.getString(name);
            Object o = jsonObject.get(name);
            List<T> dataList = new ArrayList<>();
            Gson gson = new Gson();
            if (o instanceof JSONArray) {
                JSONArray jsonArray = (JSONArray) o;
                for (int i = 0; i < jsonArray.length(); i++) {
                    Object o1 = jsonArray.get(i);
                    if (o1 instanceof JSONObject) {
                        dataList.add(gson.fromJson(o1.toString(), clzz));
                    }
                }
            }
            return dataList;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static <T> List<T> getParamList(JSONArray jsonArray, Class<T> clzz) {
        try {
            List<T> dataList = new ArrayList<>();
            Gson gson = new Gson();
            for (int i = 0; i < jsonArray.length(); i++) {
                Object o = jsonArray.get(i);
                if (o instanceof JSONObject) {
                    dataList.add(gson.fromJson(o.toString(), clzz));
                }
            }
            return dataList;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

怎麼使用呢?

public class Person {
    private String name;
    private Integer age;
    private String sex;
    private String address;

    public Person(String name, Integer age, String sex, String address) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
 List<Person> list = new ArrayList<>();
        Person person = new Person("小明", 12, "男", "黃沙石");
        list.add(person);
        person = new Person("小花", 12, "男", "黃沙石");
        list.add(person);
        person = new Person("小剛", 12, "男", "黃沙石");
        list.add(person);
        person = new Person("小李", 12, "男", "黃沙石");
        list.add(person);
        Gson gson = new Gson();
        String json = gson.toJson(list);
        List<Person> paramList = JsonUtil.getParamList(JsonUtil.createJSONArray(json), Person.class);

解析很方便,很多的功能都可以自己去加的

工具類全部的程式碼貼出來
public class JsonUtil {
    
    //私有化構造方法
    private JsonUtil() {
    }
    
    //例項化出JSONObject
    public static JSONObject createJSONObject(String json) {
        try {
            JSONObject jsonObject = new JSONObject(json);
            return jsonObject;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    //例項化出JSONArray物件
    public static JSONArray createJSONArray(String json) {
        try {
            JSONArray jsonArray = new JSONArray(json);
            return jsonArray;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    //獲取資料
    public static <T> T getParam(JSONObject jsonObject, String name) {
        try {
            return (T) jsonObject.get(name);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    //獲取資料
    public static <T> List<T> getParamList(JSONObject jsonObject, Class<T> clzz, String name) {
        try {
            String data = jsonObject.getString(name);
            Object o = jsonObject.get(name);
            List<T> dataList = new ArrayList<>();
            Gson gson = new Gson();
            if (o instanceof JSONArray) {
                JSONArray jsonArray = (JSONArray) o;
                for (int i = 0; i < jsonArray.length(); i++) {
                    Object o1 = jsonArray.get(i);
                    if (o1 instanceof JSONObject) {
                        dataList.add(gson.fromJson(o1.toString(), clzz));
                    }
                }
            }
            return dataList;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static <T> List<T> getParamList(JSONArray jsonArray, Class<T> clzz) {
        try {
            List<T> dataList = new ArrayList<>();
            Gson gson = new Gson();
            for (int i = 0; i < jsonArray.length(); i++) {
                Object o = jsonArray.get(i);
                if (o instanceof JSONObject) {
                    dataList.add(gson.fromJson(o.toString(), clzz));
                }
            }
            return dataList;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
}