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 getParam(JSONObject jsonObject, String name) {
try {
return (T) jsonObject.get(name);
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
仅仅几行就可以了,根本不用考虑到类型的问题,这也是泛型的一种使用方式,只要你获取的类型跟你想要的类型一致的话就没问题,不然就会报李类型转换异常,毕竟类型都不一样怎么会不报错呢。
第五步:就是如何自动转成想要的类型,其实每个人都有不同的解决方法,我用谷歌推出的Gson来进行类的解析的.
//获取数据
public static List getParamList(JSONObject jsonObject, Class clzz, String name) {
try {
String data = jsonObject.getString(name);
Object o = jsonObject.get(name);
List 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 List getParamList(JSONArray jsonArray, Class clzz) {
try {
List 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 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 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 getParam(JSONObject jsonObject, String name) {
try {
return (T) jsonObject.get(name);
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
//获取数据
public static List getParamList(JSONObject jsonObject, Class clzz, String name) {
try {
String data = jsonObject.getString(name);
Object o = jsonObject.get(name);
List 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 List getParamList(JSONArray jsonArray, Class clzz) {
try {
List 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;
}
}