`
Abel_Chen_
  • 浏览: 17748 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android:使用Gson解析复杂的JSON数据

 
阅读更多

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,目前广泛使用。本文主要讲解android如何解析复杂格式的JSON数据,适合android初学者和初步接触JSON的人。 
1.JSON相关介绍: 
首先了解一下JSON的相关内容,JSON中的数据是以键值对的形式出现的。例如”name”:”jack”;这就是一个键值对,可以理解为name=jack。JSON中很重要的两个概念就是数组(array)和对象(object),初学者们很容易会把这两个概念搞错。区分是数组还是对象最简单的办法就是看是在{ ……}(大括号中),还是在 …… 。Object在大括号中,数组在中括号中。所有的JSON数据都是建立在数组和对象的基础上经过不同的组合而生成的。因此,可以说理解了数组和对象,就可以解析出各种复杂的JSON数据。 
2.Android中使用Gson进行JSON解析。 
Android解析JSON数据的方法有很多,例如:原生android的解析方法就是JSONObject和JSONArray,这样的解析有些繁琐。还有就是利用第三方的包,本文主要是使用Gson对JSON数据进行解析,当然还有FastJson,这个也很不错,大家可以试一试。 
首先自然要下载GSON包了,这个网上有很多,我就不贴出连接了。下载完GSON包之后导入到项目中(project),就行了,如图: 
这里写图片描述
这样就可以使用Gson包了。 
3.如何使用GSON解析 
解析JSON数据最重要的一步就是根据JSON数据构建出bean文件,这里一步一步教大家如何构建出bean文件。 
JSON数据如下:

{"showapi_res_code":0,"showapi_res_error":"","showapi_res_body":{"pagebean":{"allNum":577,"allPages":29,"contentlist":[{"channelId":"5572a108b3cdc86cf39001cd","channelName":"国内焦点","desc":"   中国警察网同仪式在北京举行....","imageurls":[{"height":480,"url":"http://n.sinaimg.cn/news/transform/20160423/P7Jb-fxrqhar9853560.jpg","width":400}],"link":"http://news.sina.com.cn/c/nd/2016-04-23/doc-ifxrpvea1126476.shtml","pubDate":"2016-04-23 10:16:54","source":"新浪","title":"公安部原部长送花圈"},{"channelId":"5572a108b3cdc86cf39001cd","channelName":"国内焦点","desc":"   原标题:山东3县市购房补钱!日前,即墨市制定《关于促进房地产市场持续健康平稳发展的实施意见》,即墨市财政 将对购房者予以补贴。从《意见》出台之日起到今年年底前,在即墨首次购新建商品房的市民,每平米可领取补贴50到200元。对购....","imageurls":[{"height":327,"url":"http://ww4.sinaimg.cn/mw690/77de9208jw1f36aamk03mj20go093406.jpg","width":600}],"link":"http://news.sina.com.cn/c/nd/2016-04-23/doc-ifxrpvea1122744.shtml","pubDate":"2016-04-23 07:52:13","source":"新浪","title":"山东3县市对购房者予以财政补贴"},{"channelId":"5572a108b3cdc86cf39001cd","channelName":"国内焦点","desc":"   原标题:首家商业火箭公司成立  京华时报讯(记者潘珊菊)昨天下午,记者从航天科工集团获悉,在成功发射首颗卫星“东方红一号”46年后,中国航天 技术步入“商用时代”,我国首家商业模式开展研发和应用的专业化火箭公司已于今年2月16日在武汉注册成立。  据介绍,该公....","imageurls":[],"link":"http://news.sina.com.cn/o/2016-04-23/doc-ifxrpvqz6479220.shtml","pubDate":"2016-04-23 03:19:35","source":"新浪","title":"中国首家商业火箭公司成立 注册时曾引官方争议"}],"currentPage":1,"maxResult":20},"ret_code":0}}

一步一步来: 
这里写图片描述
这是把所有的括号都收起来的样子 
1展开大括号: 
这是第一层,我们给一个标记为A。 
这里写图片描述
2展开showapi_res_body后面的大括号: 
这是第二层,我们给一个标记为B。 
这里写图片描述
3展开pagebean后面的大括号: 
这是第三层,我们给一个标记为C。 
这里写图片描述
4展开contentlist后面的中括号,这是一个数组 
这是第四层,我们给一个标记为D。 
这里写图片描述
5展开contentlist里面的object中的大括号 
这是第五层,我们给一个标记为E。 
这里写图片描述
6展开imageurls的中括号 
这是第六层,我们给一个标记为F 
这里写图片描述
7展开imageurls里面object的大括号 
这是第七层,我们给一个标记为G 
这里写图片描述
到此,所有的括号全部展开,所有的结构也非常清晰。contentlist和imageurls是两个JSON数组而且数组的元素是JSON对象。 
下面就开始构建bean文件了。 
首先,建一个包 com.example.bean 
包内放的就是bean文件。 
如图A所示,第一层构建一个类: 
1.我们构建一个java类HomeNewsBean

package com.example.bean.homenews;publicclassHomeNewsBean{privateString showapi_res_code;privateString showapi_res_error;privateHomeNewsBeanBody showapi_res_body;publicStringgetShowapi_res_code(){return showapi_res_code;}publicvoidsetShowapi_res_code(String showapi_res_code){this.showapi_res_code = showapi_res_code;}publicStringgetShowapi_res_error(){return showapi_res_error;}publicvoidsetShowapi_res_error(String showapi_res_error){this.showapi_res_error = showapi_res_error;}publicHomeNewsBeanBodygetShowapi_res_body(){return showapi_res_body;}publicvoidsetShowapi_res_body(HomeNewsBeanBody showapi_res_body){this.showapi_res_body = showapi_res_body;}@OverridepublicStringtoString(){return"HomeNewsBean [showapi_res_code="+ showapi_res_code
                +", showapi_res_error="+ showapi_res_error
                +", showapi_res_body="+ showapi_res_body +"]";}}

2.类中HomeNewsBeanBody是第二层B中的类。

package com.example.bean.homenews;publicclassHomeNewsBeanBody{privateHomeNewsPageBean pagebean;privateString ret_code;publicHomeNewsPageBeangetPagebean(){return pagebean;}publicvoidsetPagebean(HomeNewsPageBean pagebean){this.pagebean = pagebean;}publicStringgetRet_code(){return ret_code;}publicvoidsetRet_code(String ret_code){this.ret_code = ret_code;}@OverridepublicStringtoString(){return"HomeNewsBeanBody [pagebean="+ pagebean +", ret_code="+ ret_code +"]";}}

3.类中HomeNewsPageBean是第三层C中的类

package com.example.bean.homenews;import java.util.List;publicclassHomeNewsPageBean{privateString allNum;privateString allPages;privateString currentPage;privateString maxResult;privateList<HomeNewsContentList> contentlist;publicStringgetAllNum(){return allNum;}publicvoidsetAllNum(String allNum){this.allNum = allNum;}publicStringgetAllPages(){return allPages;}publicvoidsetAllPages(String allPages){this.allPages = allPages;}publicStringgetCurrentPage(){return currentPage;}publicvoidsetCurrentPage(String currentPage){this.currentPage = currentPage;}publicStringgetMaxResult(){return maxResult;}publicvoidsetMaxResult(String maxResult){this.maxResult = maxResult;}publicList<HomeNewsContentList>getContentlist(){return contentlist;}publicvoidsetContentlist(List<HomeNewsContentList> contentlist){this.contentlist = contentlist;}@OverridepublicStringtoString(){return"HomeNewsPageBean [allNum="+ allNum +", allPages="+ allPages
                +", currentPage="+ currentPage +", maxResult="+ maxResult
                +", contentlist="+ contentlist +"]";}}

4.类中HomeNewsContentList是第和第四层D和第五层E中的类,这里注意:JSON数据中,这是数组,因此要使用List来存放。

package com.example.bean.homenews;import java.util.List;publicclassHomeNewsContentList{privateString channelId;privateString channelName;privateString desc;privateList<HomeNewsImages> imageurls;privateString link;privateString pubDate;privateString source;privateString title;publicStringgetChannelId(){return channelId;}publicvoidsetChannelId(String channelId){this.channelId = channelId;}publicStringgetChannelName(){return channelName;}publicvoidsetChannelName(String channelName){this.channelName = channelName;}publicStringgetDesc(){return desc;}publicvoidsetDesc(String desc){this.desc = desc;}publicList<HomeNewsImages>getImageurls(){return imageurls;}publicvoidsetImageurls(List<HomeNewsImages> imageurls){this.imageurls = imageurls;}publicStringgetLink(){return link;}publicvoidsetLink(String link){this.link = link;}publicStringgetPubDate(){return pubDate;}publicvoidsetPubDate(String pubDate){this.pubDate = pubDate;}publicStringgetSource(){return source;}publicvoidsetSource(String source){this.source = source;}publicStringgetTitle(){return title;}publicvoidsetTitle(String title){this.title = title;}@OverridepublicStringtoString(){return"HomeNewsContentList [channelId="+ channelId +", channelName="+ channelName +", desc="+ desc +", imageurls="+ imageurls
                +", link="+ link +", pubDate="+ pubDate +", source="+ source +", title="+ title +"]";}}

5.同理类中HomeNewsImages是第六层F和第七层G中的类,也是List存放。

package com.example.bean.homenews;publicclassHomeNewsImages{privateString height;privateString url;privateString width;publicStringgetHeight(){return height;}publicvoidsetHeight(String height){this.height = height;}publicStringgetUrl(){return url;}publicvoidsetUrl(String url){this.url = url;}publicStringgetWidth(){return width;}publicvoidsetWidth(String width){this.width = width;}@OverridepublicStringtoString(){return"HomeNewsImages [height="+ height +", url="+ url +", width="+ width +"]";}}

到此为止,所有的bean文件全部构建完毕。 
注意:所有的JSON数据的key:value键值对中的key要和bean文件中的对象一一对应,名字要完全一样!不然无法解析!!! 
例如 这里面的 
showapi_res_body要和JSON数据中的 一模一样。 
接下来就是解析的过程了,最难的地方已经过去,接下来就是几行代码的事情了。 
首先:传入URL,发送http请求,从服务器获取JSON数据。

publicstaticStringnetLink(String URL){HttpClient httpClient =newDefaultHttpClient();//访问指定的服务器HttpGet httpGet =newHttpGet(URL);HttpResponse httpResponse =null;String response =null;try{
            httpResponse = httpClient.execute(httpGet);}catch(Exception e){// TODO Auto-generated catch block
            e.printStackTrace();}if(httpResponse.getStatusLine().getStatusCode()==200){//200说明请求和响应都是成功的HttpEntity entity = httpResponse.getEntity();try{
                response =EntityUtils.toString(entity,"utf-8");}catch(Exception e){// TODO Auto-generated catch block
                e.printStackTrace();}}return response;}

返回的JSON数据在response中。然后,对返回的JSON进行解析。

Gson gson =newGson();HomeNewsBean homeNewsBean = gson.fromJson(response,HomeNewsBean.class);

两句话完成解析。 
我把解析过程写成了一个函数

publicstaticList<HomeNewsContentList>parseJsonWithGson2(List<HomeNewsContentList> newsLists,String jsonData){Gson gson =newGson();HomeNewsBean homeNewsBean = gson.fromJson(jsonData,HomeNewsBean.class);for(int i =0;i<homeNewsBean.getShowapi_res_body().getPagebean().getContentlist().size();i++){
            newsLists.add(homeNewsBean.getShowapi_res_body().getPagebean().getContentlist().get(i));}return newsLists;}

这样JSON数据就存在了List中。到此,解析结束。想要拿出数据只需调用newsLists.get()就可以了。 
该文的JSON实例应该算比较复杂的JSON数据了,如果能掌握文中的复杂JSON解析,那么其他的复杂JSON数据解析应该没有问题。 
最后,感谢阅读,卖个萌o(∩_∩)o 哈哈!

转载地址:http://itfish.net/article/58577.html

分享到:
评论

相关推荐

    Gson解析复杂Json实例,超简单

    假设我们有以下JSON数据: ```json { "users": [ { "name": "张三", "age": 25, "address": { "city": "北京", "country": "中国" } }, { "name": "李四", "age": 30, "address": { "city": "上海", ...

    Android Studio下使用Google Gson解析Json数据示例

    本篇文章将详细介绍如何在Android Studio环境下使用Google Gson解析Json数据。 首先,我们需要在项目中引入Gson库。打开build.gradle模块文件,并在dependencies块中添加以下依赖: ```groovy dependencies { ...

    Gson解析json数据

    在本文中,我们将深入探讨如何使用Gson解析JSON数据,包括处理简单JSON和复杂的JSON结构。 首先,我们要了解JSON的基本概念。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,...

    Android使用Kotlin利用Gson解析多层嵌套Json数据

    Android使用Kotlin利用Gson解析多层嵌套Json数据

    使用Gson解析Json数据

    1、生成Json数据 2、使用Gson解析Json数据(单个json对象、json数组和json对象内嵌json数组) // 这里有两篇好心人的博文,有详细的讲解 http://www.jb51.net/article/32547.htm ...

    Gson简单与复杂json数据解析案例

    在"简单与复杂json数据解析案例"中,我们将探讨如何使用Gson处理各种JSON结构。 1. **Gson基本使用** - **序列化**: 将Java对象转换为JSON字符串。例如,有一个名为`Person`的类,包含`name`和`age`字段,我们可以...

    android中gson解析json数据例程

    本篇文章将详细介绍如何在Android应用中使用Gson库解析JSON数据,以便更好地理解这一关键知识点。 首先,我们要了解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于...

    使用Gson解析json数据

    本教程将重点介绍如何使用Gson库在Java环境中解析JSON数据。 Gson是Google提供的一款开源库,它能够将Java对象转换为对应的JSON字符串,也可以将JSON数据反序列化为Java对象。这对于处理JSON数据非常方便。在本示例...

    使用gson解析json

    使用Gson解析JSON JSON(JavaScript Object Notation)是一种轻量级的文本数据交换格式,独立于语言和平台,使用JavaScript语法来描述数据对象。JSON具有自我描述性,更易理解。JSON解析器和JSON库支持许多不同的...

    Eclipse下使用Google Gson解析Json数据示例+Android Studio下使用Google Gson解析Json数据示例

    本文将详细介绍如何在Eclipse和Android Studio环境下使用Gson库来解析Json数据。 首先,我们来看Eclipse下的Gson使用示例。在Eclipse中,你需要先引入Gson库。这可以通过在项目构建路径中添加Gson的jar文件完成,...

    通过Gson解析Json文件

    JSON数据通常以键值对的形式存在,可以表示复杂的数据结构,如数组、对象等。 Gson库是Google提供的一套API,用于在Java对象和JSON字符串之间进行互转。它支持将Java对象转换为JSON字符串,以及将JSON字符串反序列...

    android之json和gson数据解析最完整的代码例子(包括各种样式的json数据)

    在Android中,我们通常使用`org.json`库或`com.google.gson`库来解析JSON数据。 1. `org.json`库:这是Android SDK自带的一个轻量级库,主要用于解析简单的JSON数据。 - JSONObject:表示一个JSON对象,可以通过`...

    JSON、GSON解析json

    4. 解析复杂JSON数据:如果JSON数据包含嵌套的对象或数组,GSON可以自动处理。例如,如果有如下JSON: ```json { "user": { "name": "John", "age": 30 }, "friends": [ { "name": "Jane", "age": 28 }, ...

    Android中使用Gson解析JSON数据的两种方法

    本文将详细介绍如何利用Google的Gson库在Android中解析JSON数据。 首先,为了在Android项目中使用Gson库,你需要从`code.google.com/p/google-gson/downloads/list`下载最新版本的GsonAPI,例如`google-gson-1.7.1-...

    android中使用gson来创建和解析json数据

    本文将详细介绍如何在Android中使用Gson来创建和解析JSON数据。 首先,你需要在项目中引入Gson库。如果你的项目使用的是Gradle构建系统,可以在`build.gradle`文件的dependencies块中添加以下依赖: ```groovy ...

    使用Gson解析json并且加载json中的网络图片

    在这个场景中,"使用Gson解析json并且加载json中的网络图片"涉及到的关键技术点包括Gson库的使用、JSON解析、ListView的填充以及网络图片的加载。 首先,我们要理解Gson的工作原理。Gson通过反射机制,能够自动地将...

    Gson解析(List和Map)格式json数据 - CSDN博客1

    【Gson解析JSON数据】 Gson是Google提供的一款强大的Java库,用于在Java对象和JSON数据之间进行映射。它可以将任何Java对象转换为它的JSON表示形式,反之亦然。在处理JSON数据时,我们经常遇到两种常见的数据结构:...

    Android_JSON数据解析

    总结,Android中解析JSON数据涉及的关键知识点包括JSON的基本结构、Gson库的使用、JSONObject和JSONArray的操作、Volley库的网络请求以及Retrofit框架的使用。这些工具和技术使得Android开发者能够高效地处理服务器...

    Android通过gson自动解析服务器返回的json数据

    本文将详细介绍如何在Android应用中使用Gson库来自动解析服务器返回的JSON数据。 首先,确保在项目中正确导入Gson库。如果你的项目是基于Gradle构建的,可以在app模块的build.gradle文件中添加依赖: ```groovy ...

    assets下使用gson进行json文件读取

    至此,我们已经了解了如何在Android的`assets`目录下使用`Gson`读取和解析JSON数据,以及如何对JSON进行格式化。这些知识对于处理本地存储的JSON数据至关重要,特别是在处理复杂的数据结构时。在实际开发中,根据...

Global site tag (gtag.js) - Google Analytics