目前网络数据都是以json格式返回到客户端,而解析json的方式却有好多种。在项目中比较常用的是Gson解析,那么接下来,由我为大家讲解如何快速掌握使用Gson解析多种复杂json。
首先大家心里要明白以下几个问题:
什么是Gson?
为什么要使用Gson解析json?使用Gson解析json有什么优势?
如何快速有效理解并掌握使用Gson解析json?
现在我们来回顾一下,什么是json?
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
JSON 是轻量级的文本数据交换格式
JSON 独立于语言
JSON 具有自我描述性,更易理解
总之, JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
给大家推荐一个Json在线解析及格式化验证网址:http://www.bejson.com//
回归正题,下面开始解答在片头提出的三个问题:
什么是Gson?
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。
为什么要使用Gson解析json?使用Gson解析json有什么优势?
首先使用Gson解析可以很方便的将一个 Json 字符串转成一个 Java 对象,或者将一个Java对象转成一个Json字符串(前提注意,java对象属性要和json中要字段一一对应,否则解析失败)。其次,我个人觉得,使用Gson解析很方便,你想想,实体类和json对应,而且Gson中会提供直接转java或者json的方法,只需寥寥几行就可以实现,对我LZ脑子反应慢的人来说,真是解析Json必备利器之一哈。。。
如何快速有效理解并掌握使用Gson解析json?
其实我理解的就是Gson解析json就是,首先会有一个和json字符串相对应的Java Bean。其次,使用Gson所提供的toJson()将实体类转化为json格式的字符串,或者使用fromJson()将json格式的字符串直接转为你的实体类。其中涉及到java反射,射来射去的,有兴趣的大家可以自己去了解一下
下面为大家介绍Gson解析中所提供的很强大的方法:
1.1 toJson()方法
toJson()方法用于将Java对象转换为相应的JSON数据,主要有以下几种形式:
(1)String toJson(JsonElement jsonElement);
(2)String toJson(Object src);
(3)String toJson(Object src, Type typeOfSrc);
其中,方法(1)用于将JsonElement对象(可以是JsonObject、JsonArray等)转换成JSON数据;方法(2)用于将指定的Object对象序列化成相应的JSON数据;方法(3)用于将指定的Object对象(可以包括泛型类型)序列化成相应的JSON数据。
1.2 fromJson()方法
fromJson()方法用于将JSON数据转换为相应的Java对象,主要有以下几种形式:
(1)<T> T fromJson(JsonElement json, Class<T> classOfT);
(2)<T> T fromJson(JsonElement json, Type typeOfT);
(3)<T> T fromJson(JsonReader reader, Type typeOfT);
(4)<T> T fromJson(Reader reader, Class<T> classOfT);
(5)<T> T fromJson(Reader reader, Type typeOfT);
(6)<T> T fromJson(String json, Class<T> classOfT);
(7)<T> T fromJson(String json, Type typeOfT);
以上的方法用于将不同形式的JSON数据解析成Java对象。
啰嗦了这么多,接下来开始实战。。。
下载一个gson包,并导入项目工程中...
提供我当前使用的json字符串如下:
json串太长,拷贝时没注意,竟然不正确,不过不妨碍大家继续学习,暂时删除此json数据
看到这么一堆json串串,是不是感觉有点头大,不急,我们现在打开上面提供的Json在线解析及格式化验证网址:http://www.bejson.com//。我们一起来分析分析,赤裸裸站在我们面前~
这里面包括了
三个字段(message,today,code),俩个List(List<AppAppMessageBigBean>,List<AppRecommendCommodityBean>)以及一个对象(CourseOneStageBean)。
首先在xxx.xxx.httpbeans下创建当前接受json的实体类,格式如下:
public class MessageBigBeansAndRecommendCommodityBean { private int code;//返回Code码 private String message;//返回信息 private String today;//当前时间 private CourseOneStageBean courseonestagebean;// 课程阶段 private List<AppMessageBigBean> appMessageBigBeans;// 资讯推荐list private List<AppRecommendCommodityBean> appRecommendCommodityBeans;// 为您推荐(商品定制) public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String getToday() { return today; } public void setToday(String today) { this.today = today; } public CourseOneStageBean getCourseOneStageBean() { return courseonestagebean; } public void setCourseOneStageBean(CourseOneStageBean courseOneStageBean) { this.courseonestagebean = courseOneStageBean; } public List<AppMessageBigBean> getAppMessageBigBeans() { return appMessageBigBeans; } public void setAppMessageBigBeans(List<AppMessageBigBean> appMessageBigBeans) { this.appMessageBigBeans = appMessageBigBeans; } public List<AppRecommendCommodityBean> getAppRecommendCommodityBeans() { return appRecommendCommodityBeans; } public void setAppRecommendCommodityBeans(List<AppRecommendCommodityBean> appRecommendCommodityBeans) { this.appRecommendCommodityBeans = appRecommendCommodityBeans; } }
其中关于CourseOneStageBean ,AppMessageBigBean,AppRecommendCommodityBean这三个实体类属性和json中一一对应,这几个实体类可以放在xxx.xxx.beans下,以便更好的区分网络接收所需的Java Bean和本地所需Java Bean。
只要你确认上面实体类和json中一一对应,下面都是小意思啦。。。
Gson gson = new Gson();//json转JavaBeanMessageBigBeansAndRecommendCommodityBean messageBigBeansAndRecommendCommodityBean = gson.fromJson("Json字符串", MessageBigBeansAndRecommendCommodityBean.class);//JavaBean转jsonString json=gson.toJson(messageBigBeansAndRecommendCommodityBean);
第一次认认真真写一篇博客。。。有问题可以大家一起研究~虽然我懂得不多~哈