Android之json复杂数据解析
2017-11-22 18:15
423 查看
关于json的介绍这里不提,我们这次只讲如何解析较为复杂的json数据,我会通过案例加导图的方式将方法铺展开来向大家阐述!力求让大家深入了解json数据的解析方式!
关于复杂json数据:这里指的复杂json数据并不是指那种多而杂的数据,而是指json数据不是单一的对象或者数组,而是包含两者,我们首先看一下json数据
这个json数据包含对象和数组,两者是互相穿插的,此次我们就以这个json数据为例进行解析!
首先我先贴上此次解析数据的一个简易思维导图,方便大家整体把握。
![](https://img-blog.csdn.net/20171122180943086?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMzM5MjExMDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
解析json数据的时候大家按照一下三大步骤进行书写代码
1. 获取json数据
2. 解析json数据
3. 显示json数据
下面我们新建一个工程JsonDemo
首先我们先创建布局,布局很简单,一个button两个textview,分别用来点击按钮开始解析数据,分别显示原始json数据和解析后的json数据,这里省去创建代码。
接下来我们按照解析的三大步骤进行代码书写,第一步获取我们需要解析的json数据。
代码:
其实就是将json数据复制过去。获取到json数据之后我们就开始真正的对数据进行解析了,在此之前为了方便我们解析json数据,我们可以先将json数据进行格式化,随便百度一搜json数据格式化就会找到很多在线工具。
![](https://img-blog.csdn.net/20171122181019125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMzM5MjExMDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
格式化之后如图,我们发现这样一来我们对json数据的层次就会看的非常清楚,在解析较为复杂的json数据的时候,关键一点就是我们要分析json数据的层次,如此一来我们就可以很方便的观察json数据的各个层级了,如图所指+号是可以点击的,展开会显示下一层级内容,解析来我们看如何分层解析。
重点说明一点,我们解析的时候是对照着格式化之后的json数据进行解析的,因为层级很重要。
第一层解析代码:
这里用到原生的JsonObJect,可能你使用的是getxxx而我这里使用的是optxxx,简单说明一点,getxxx又可能报空指针异常,在文章末尾会详细说明,我们继续第二层解析
当完成第二层解析之后,现在就只剩下items需要解析了,可以看到,items是一个数组,数组中的每一个元素又都是一个json对象,因此我们可以对数组进行遍历,看第三层解析
至此我们已经将json数据全部解析完成了,但是我们会发现,我们解析到的数据似乎有点乱,使用也有点不方便,接下来我们将解析的json数据封装成Java对象,这样使用起来就非常方便了,首先我们需要根据json数据构建一个实体类也即是一个JavaBean,这里我们可以使用AS的一个插件GsonForMat可以将json数据一键生成JavaBean对象
生成的JavaBean对象我们暂且叫做DataInfo,使用方法也很简单,安装好GsonForMat插件之后重启as,在新建的DataInfo上右击选择Generate然后选择GsonForMat,将json数据复制进去一直ok下去就可以了。
另外可能有些人对javaBean不太了解,我比较认同的一个比较直白的说法是JavaBean就是一个数据包,里面包含各种属性,并且提供属性get和set等方法,可以通过set将数据设置进去,然后需要的时候通过get得到数据,具体的大家可以百度了解一下。
生成Javabean之后,我们就要将解析得到的json数据封装到这个Javabean中,下面开始
我们注意理解注释JavaBean的代码,执行上述代码之后我们就将json数据解析完成并且将数据封装到javab中,至此我们就可以通过JavaBean得到我们想要的解析之后的json数据了。
比如,你想单独拿到rs_code的值,你可以这样做
再比如你只需要“坚果”这个数据,你可以这样做
以上就是拿到具体数据的一些示例,接下来我们完成这个demo,拿到所有数据
在此之前你需要给你的JavaBean加上toString方法才行。至此大功告成。
现在来总结一下,解析按照三个大步骤
1. 获取数据
2. 解析数据
3. 显示数据
当数据较为复杂的时候,我们可以借助json数据格式化工具将数据格式化,方便我们进行分层解析,将解析的数据封装到JavaBean方便我们使用。
补充:optxxx和getxxx的区别。
optXxx方法会在对应的key中的值不存在的时候返回一个空字符串或者返回你指定的默认值,但是getString方法会出现空指针异常的错误。
源码已经上传至CSDN下载源码
关于复杂json数据:这里指的复杂json数据并不是指那种多而杂的数据,而是指json数据不是单一的对象或者数组,而是包含两者,我们首先看一下json数据
{ "data": { "count": 5, "items": [ { "id": 45, "title": "坚果" }, { "id": 132, "title": "炒货" }, { "id": 166, "title": "蜜饯" }, { "id": 195, "title": "果脯" }, { "id": 196, "title": "礼盒" } ] }, "rs_code": "1000", "rs_msg": "success" }
这个json数据包含对象和数组,两者是互相穿插的,此次我们就以这个json数据为例进行解析!
首先我先贴上此次解析数据的一个简易思维导图,方便大家整体把握。
解析json数据的时候大家按照一下三大步骤进行书写代码
1. 获取json数据
2. 解析json数据
3. 显示json数据
下面我们新建一个工程JsonDemo
首先我们先创建布局,布局很简单,一个button两个textview,分别用来点击按钮开始解析数据,分别显示原始json数据和解析后的json数据,这里省去创建代码。
接下来我们按照解析的三大步骤进行代码书写,第一步获取我们需要解析的json数据。
代码:
//获取json数据 String json = "{\n" + " \"data\": {\n" + " \"count\": 5,\n" + " \"items\": [\n" + " {\n" + " \"id\" ece7 : 45,\n" + " \"title\": \"坚果\"\n" + " },\n" + " {\n" + " \"id\": 132,\n" + " \"title\": \"炒货\"\n" + " },\n" + " {\n" + " \"id\": 166,\n" + " \"title\": \"蜜饯\"\n" + " },\n" + " {\n" + " \"id\": 195,\n" + " \"title\": \"果脯\"\n" + " },\n" + " {\n" + " \"id\": 196,\n" + " \"title\": \"礼盒\"\n" + " }\n" + " ]\n" + " },\n" + " \"rs_code\": \"1000\",\n" + " \"rs_msg\": \"success\"\n" + "}";
其实就是将json数据复制过去。获取到json数据之后我们就开始真正的对数据进行解析了,在此之前为了方便我们解析json数据,我们可以先将json数据进行格式化,随便百度一搜json数据格式化就会找到很多在线工具。
格式化之后如图,我们发现这样一来我们对json数据的层次就会看的非常清楚,在解析较为复杂的json数据的时候,关键一点就是我们要分析json数据的层次,如此一来我们就可以很方便的观察json数据的各个层级了,如图所指+号是可以点击的,展开会显示下一层级内容,解析来我们看如何分层解析。
重点说明一点,我们解析的时候是对照着格式化之后的json数据进行解析的,因为层级很重要。
第一层解析代码:
//第一层解析 JSONObject jsonObject = new JSONObject(json); JSONObject data = jsonObject.optJSONObject("data"); int rs_code = jsonObject.optInt("rs_code"); String rs_msg = jsonObject.optString("rs_msg");
这里用到原生的JsonObJect,可能你使用的是getxxx而我这里使用的是optxxx,简单说明一点,getxxx又可能报空指针异常,在文章末尾会详细说明,我们继续第二层解析
//第二层解析 int count = data.optInt("count"); JSONArray items = data.optJSONArray("items");
当完成第二层解析之后,现在就只剩下items需要解析了,可以看到,items是一个数组,数组中的每一个元素又都是一个json对象,因此我们可以对数组进行遍历,看第三层解析
//第三层解析 for (int i = 0;i<items.length();i++){ JSONObject jsonObject1 = items.optJSONObject(i); if (jsonObject1 != null){ int id = jsonObject1.optInt("id"); String title = jsonObject1.optString("title"); } }
至此我们已经将json数据全部解析完成了,但是我们会发现,我们解析到的数据似乎有点乱,使用也有点不方便,接下来我们将解析的json数据封装成Java对象,这样使用起来就非常方便了,首先我们需要根据json数据构建一个实体类也即是一个JavaBean,这里我们可以使用AS的一个插件GsonForMat可以将json数据一键生成JavaBean对象
生成的JavaBean对象我们暂且叫做DataInfo,使用方法也很简单,安装好GsonForMat插件之后重启as,在新建的DataInfo上右击选择Generate然后选择GsonForMat,将json数据复制进去一直ok下去就可以了。
另外可能有些人对javaBean不太了解,我比较认同的一个比较直白的说法是JavaBean就是一个数据包,里面包含各种属性,并且提供属性get和set等方法,可以通过set将数据设置进去,然后需要的时候通过get得到数据,具体的大家可以百度了解一下。
生成Javabean之后,我们就要将解析得到的json数据封装到这个Javabean中,下面开始
try {
//第一层解析
JSONObject jsonObject = new JSONObject(json);
JSONObject data = jsonObject.optJSONObject("data");
int rs_code = jsonObject.optInt("rs_code");
String rs_msg = jsonObject.optString("rs_msg");
//javabean
dataInfo.setRs_code(rs_code);
dataInfo.setRs_msg(rs_msg);
DataInfo.DataBean dataBean = new DataInfo.DataBean();
dataInfo.setData(dataBean);
//第二层解析 int count = data.optInt("count"); JSONArray items = data.optJSONArray("items");
//javabean
dataBean.setCount(count);
List<DataInfo.DataBean.ItemsBean> itemBean = new ArrayList<>();
dataBean.setItems(itemBean);
//第三层解析
for (int i = 0;i<items.length();i++){
JSONObject jsonObject1 = items.optJSONObject(i);
if (jsonObject1 != null){
int id = jsonObject1.optInt("id");
String title = jsonObject1.optString("title");
//javabean
DataInfo.DataBean.ItemsBean bean = new DataInfo.DataBean.ItemsBean();
bean.setId(id);
bean.setTitle(title);
itemBean.add(bean);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
我们注意理解注释JavaBean的代码,执行上述代码之后我们就将json数据解析完成并且将数据封装到javab中,至此我们就可以通过JavaBean得到我们想要的解析之后的json数据了。
比如,你想单独拿到rs_code的值,你可以这样做
String a = dataInfo.getRs_msg(); mNewTv.setText(a);
再比如你只需要“坚果”这个数据,你可以这样做
//拿到“坚果” DataInfo.DataBean data = dataInfo.getData(); List<DataInfo.DataBean.ItemsBean> items = data.getItems(); DataInfo.DataBean.ItemsBean bean = items.get(0); String title = bean.getTitle(); mOldTv.setText(title);
以上就是拿到具体数据的一些示例,接下来我们完成这个demo,拿到所有数据
//显示数据 mOldTv.setText(json); mNewTv.setText(dataInfo.toString());
在此之前你需要给你的JavaBean加上toString方法才行。至此大功告成。
现在来总结一下,解析按照三个大步骤
1. 获取数据
2. 解析数据
3. 显示数据
当数据较为复杂的时候,我们可以借助json数据格式化工具将数据格式化,方便我们进行分层解析,将解析的数据封装到JavaBean方便我们使用。
补充:optxxx和getxxx的区别。
optXxx方法会在对应的key中的值不存在的时候返回一个空字符串或者返回你指定的默认值,但是getString方法会出现空指针异常的错误。
源码已经上传至CSDN下载源码
相关文章推荐
- Android Gson解析复杂的json数据
- Android中使用GSON包解析JSON数据(复杂JSON)
- android反地址解析和解析复杂一点的json数据
- Android利用Gson库解析复杂结构的JSON数据
- Android开发之原生解析复杂的json数据
- [置顶] Android:使用Gson解析复杂的JSON数据
- Android中使用GSON包解析JSON数据(复杂JSON)
- Android开发中使用Gson解析OkHttp传回来的复杂json数据
- Android:使用Gson解析复杂的JSON数据
- Android:使用Gson解析复杂的JSON数据
- Android实战--解析稍复杂JSON数据DEMO
- Android进阶十一:Gson解析复杂的json数据
- android 复杂的json数据解析
- Android中复杂Json数据的解析
- Android中使用Gson解析JSON数据
- Android教程之JSON数据解析
- Android网络开发中如何使用JSON进行网络通信---Android JSON数据通讯方法解析
- Android 获取Google Weather API 并通过Xml和JSON解析数据
- android 解析json数据格式
- android 解析json数据格式(整合)