Android關於json解析,封裝簡易的工具類
阿新 • • 發佈:2018-11-10
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;
}
}