JSON常用解析方式

背景

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 personList = new Gson.fromJson(jsonData, new TypeToken>(){}.getType());

你可能感兴趣的:(JSON常用解析方式)