背景
android开发过程中,针对后台返回前端的JSON数据进行解析的方式有很多种,可以使用一些开源库例如,FastJSON、Jackson、GSON、JSONObject等,今天重点介绍一下笔者常用的两种方式,JSONObject(官方提供)以及GSON(谷歌开源库)。
使用JSONObject解析
当返回前台的是JSON数组时, 数据格式如下
[
{
"l1": {
"l1_1": [
"l1_1_1",
"l1_1_2"
]
},
"l2": {
"l2_1": null
}
},
{
"l1": {
"l1_1": [
"l1_1_1",
"l1_1_2"
]
},
"l2": {
"l2_1": null
}
}
]
此时需要配合JSONArray一起使用,先将后台返回的json字符串包装成JSONArray数组
String jsonStr;
JSONArray jsonArray = new JSONArray(jsonStr);
然后,遍历jsonArray数组,并取出JSONObject
for (int i = 0; i < jsonArray.length; i++) {
JSONObject jsonObject = jsonArray.get(i);
String jsonObjectContent = jsonObject.getString("key"); // 取出key对应的values
}
当返回前台的是JSON对象时,数据格式如下
{
"l1": {
"l1_1": [
"l1_1_1",
"l1_1_2"
]
},
"l2": {
"l2_1": null
}
}
这种数据格式直接使用JSONObject进行解析
JSONObject jsonObject = new JSONObject(responce.json);
String jsonObjectContent = jsonObject.optString("key", "defuat");
这里也可以使用jsonObject.getString()方法,为了区分两种方式的区别,先看下源码
public String optString(String name, String fallback) {
Object object = opt(name);
String result = JSON.toString(object);
return result != null ? result : fallback;
}
static String toString(Object value) {
if (value instanceof String) {
return (String) value;
} else if (value != null) {
return String.valueOf(value);
}
return null;
}
由上边两段代码可以发现,如果有获取到name对应的value,则强制它为String类型,如果不存在则返回一个默认值。
而getString方法
public String getString(String name) throws JSONException {
Object object = get(name);
String result = JSON.toString(object);
if (result == null) {
throw JSON.typeMismatch(name, object, "String");
}
return result;
}
在没有该字段或结果为null的时候会抛出异常。类型不同不会导致异常。
使用GSON解析
使用GSON库解析需要在工程build.gradle文件中增加依赖
dependencies {
compile 'com.google.code.gson:gson:2.7'
}
GSON使用起来的方便之处在于,可以直接将json转成业务层model对象,比如一段json如下
String jsonData = {"name":"wang","age:"21"}
创建业务层model类
class Person {
String name;
String age;
}
json转Person
Person person = new Gson.fromJson(jsonData, Person.class)
当需要转成数组时,需要使用TypeToken,写法如下
List<Person> personList = new Gson.fromJson(jsonData, new TypeToken<List<Person>>(){}.getType());
网友评论