一个、Gson基本介绍

Gson(又称Google Gson)是Google公司公布的一个开放源码的Java库。主要用途为串行化Java对象为JSON字符串,或反串行化JSON字符串成Java对象。

也就是Java对象与json字符串间的互相转换。解析。

二、用法

Gson的应用主要为toJson与fromJson两个转换函数,而在使用这样的对象转换之前需先创建好对象的类型以及其成员才干成功的将JSON字符串成功转换成相相应的对象。即先创建好相应的javabean。javabean中的字段与要转换的json之间要一一相应。否则会出现解析失败的情况。

将json解析成javabean对象:

javabean:

public class Person {
private String name;
private int age;
private String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;<pre name="code" class="java">

}}


json字符串:

{ "name":"zhangsan","age":20,"gender":"男"}

将此json字符串解析成java对象:

Person person = new Gson().fromJson(json, Person.class);
这样就能够将json字符串解析成javabean对象。

插入一点,json字符串和JSONObject对象之间的转换。由于有些地方可能须要json字符串,有些地方须要的是jsonobject对象

json字符串转换成JSONObject对象:
JSONObject jsonobject = new JSONObject(json);

JSONObject对象转换为json字符串

String jsonString = json.toString();

上面的情况仅仅是一种最简单的样例。假如json字符串略微复杂一点,涉及到对象的嵌套
看以下的样例:
{
"status_code": "0",
"result": {
"card_edate": "1451491200",
"edate_remark": "2015年12月31日之前免费获取",
"card_remark": "1、会员尊享多种超值特权\r\n2、会员专享预存500送50",
"merchant_id": "2",
"card_img": "http://www.yuelife.com/srdz_pic/baralogo.jpg",
"card_id": "2"
},
"status_desc": "ok"
}

这是服务端返回的一个json串,这里面就涉及到了对象的嵌套,json串里面的result參数也是一个对象。

这样的情况的处理方式例如以下:
JSONObject jsonObject = json.optJSONObject("result");

这样就又得到了一个JSONObject对象  然后又能够通过这个JSONObject对象来得到javabean对象或者直接进行解析。

假设要得到javabean对象。直接用fromjson就可以,假设直接想解析result里面的某个參数,那么就进行例如以下操作:
String cardNumber = jsonobject.optString("card_id");

这样就能够得到cardNumber的数值。


上面的情况是对象的嵌套。另一种情况是数组的嵌套,看以下的样例:
{
"status_code": "0",
"result": [
{
"Rows": [
{
"branch_longitude": "113.9760310000",
"branch_userid": "273",
"branch_addr": "深圳南山区深南大道9028号益田假日广场内L3层",
"branch_status": "1",
"is_default": "1",
"branch_phone": "13316467909,18875900656",
"branch_creattime": "0",
"city": "深圳市",
"branch_park": "门前有停车位",
"province": "广东",
"branch_guidelines": "11路公交车",
"branch_updatetime": "0",
"merchant_id": "2",
"branch_precision": "",
"branch_latitude": "22.5375870000",
"branch_id": "25",
"branch_name": "四海一家番禺店"
}
],
"shop_city": "深圳市"
},
{
"Rows": [
{
"branch_longitude": "113.3802380000",
"branch_userid": "273",
"branch_addr": "广东省广州市番禺区南村镇番禺大道(原迎宾路)万博中心A2栋1-2楼",
"branch_status": "1",
"is_default": "0",
"branch_phone": "13711112346,02038823585",
"branch_creattime": "0",
"city": "广州市",
"branch_park": "门前有停车位",
"province": "广东",
"branch_guidelines": "120路公交车",
"branch_updatetime": "0",
"merchant_id": "2",
"branch_precision": "",
"branch_latitude": "23.0032640000",
"branch_id": "26",
"branch_name": "四海一家番禺区南村镇番禺店"
}
],
"shop_city": "广州市"
}
],
"status_desc": "ok"
}

上面是服务端返回的json对象,这个json略微有点复杂。涉及到了对象的嵌套和数组的嵌套。

result字段的值是一个数组,数组里面嵌套有对象和数组。
碰到这样的情况,解决的方法事实上非常easy,那就是将[]里面的内容当作集合来处理。将{}里面的内容当作对象来处理

 所以这个json的解析,就先看result的[]内的内容。是由两个{}也就是对象组成的,因此,将以下这一段定义为一个javabean。然后解析成对象

{
"Rows": [
{
"branch_longitude": "113.9760310000",
"branch_userid": "273",
"branch_addr": "深圳南山区深南大道9028号益田假日广场内L3层",
"branch_status": "1",
"is_default": "1",
"branch_phone": "13316467909,18875900656",
"branch_creattime": "0",
"city": "深圳市",
"branch_park": "门前有停车位",
"province": "广东",
"branch_guidelines": "11路公交车",
"branch_updatetime": "0",
"merchant_id": "2",
"branch_precision": "",
"branch_latitude": "22.5375870000",
"branch_id": "25",
"branch_name": "四海一家番禺店"
}
],
"shop_city": "深圳市"
}

定义的javabean例如以下:

public class OrderSeatRows {
private List<OrderStoreBean> Rows;
private String shop_city; public List<OrderStoreBean> getRows() {
return Rows;
}
public void setRows(List<OrderStoreBean> rows) {
Rows = rows;
}
public String getShop_city() {
return shop_city;
}
public void setShop_city(String shop_city) {
this.shop_city = shop_city;
}
}

由于该javabean中的rows字段也是由[]组成,也就是rows也是一个数组,因此。将rows当成一个集合,里面的{}内容。也就是以下的内容也定义为一个javabean,解析成对象

public class OrderStoreBean {
private String branch_addr;
private String branch_userid;
private String branch_id;
private String branch_name;
private String province;
private String city;
private String branch_status;
private String branch_latitude;
private String branch_longitude;
private String is_default;
private String branch_phone;
private String branch_creattime;
private String branch_park;
private String branch_guidelines;
private String branch_updatetime;
private String merchant_id;
private String branch_precision;
public String getBranch_addr() {
return branch_addr;
}
public void setBranch_addr(String branch_addr) {
this.branch_addr = branch_addr;
}
public String getBranch_userid() {
return branch_userid;
}
public void setBranch_userid(String branch_userid) {
this.branch_userid = branch_userid;
}
public String getBranch_id() {
return branch_id;
}
public void setBranch_id(String branch_id) {
this.branch_id = branch_id;
}
public String getBranch_name() {
return branch_name;
}
public void setBranch_name(String branch_name) {
this.branch_name = branch_name;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getBranch_status() {
return branch_status;
}
public void setBranch_status(String branch_status) {
this.branch_status = branch_status;
}
public String getBranch_latitude() {
return branch_latitude;
}
public void setBranch_latitude(String branch_latitude) {
this.branch_latitude = branch_latitude;
}
public String getBranch_longitude() {
return branch_longitude;
}
public void setBranch_longitude(String branch_longitude) {
this.branch_longitude = branch_longitude;
}
public String getIs_default() {
return is_default;
}
public void setIs_default(String is_default) {
this.is_default = is_default;
}
public String getBranch_phone() {
return branch_phone;
}
public void setBranch_phone(String branch_phone) {
this.branch_phone = branch_phone;
}
public String getBranch_creattime() {
return branch_creattime;
}
public void setBranch_creattime(String branch_creattime) {
this.branch_creattime = branch_creattime;
}
public String getBranch_park() {
return branch_park;
}
public void setBranch_park(String branch_park) {
this.branch_park = branch_park;
}
public String getBranch_guidelines() {
return branch_guidelines;
}
public void setBranch_guidelines(String branch_guidelines) {
this.branch_guidelines = branch_guidelines;
}
public String getBranch_updatetime() {
return branch_updatetime;
}
public void setBranch_updatetime(String branch_updatetime) {
this.branch_updatetime = branch_updatetime;
}
public String getMerchant_id() {
return merchant_id;
}
public void setMerchant_id(String merchant_id) {
this.merchant_id = merchant_id;
}
public String getBranch_precision() {
return branch_precision;
}
public void setBranch_precision(String branch_precision) {
this.branch_precision = branch_precision;
}
}

将上面的类都定义好后,就能够開始解析了

先解析[]的内容,即先解析数组
Gson解析数组的方法例如以下:optJSONArray9()方法     jo为服务端返回的JSONObject对象
JSONArray orderJSONArray = jo.optJSONArray("result");

经过上面的解析后,就得到了一个JSONArray对象,这个对象就能够依据实际情况,继续解析。

if (null != orderJSONArray&& orderJSONArray.length() > 0) {
for (int i = 0; i < orderJSONArray.length(); i++) {
JSONObject cityJsonObject = orderJSONArray.getJSONObject(i);
OrderSeatRows orderRow = GsonUtils.toObject(cityJsonObject.toString(),OrderSeatRows.class);

便利JSONArray对象。利用getJSONObject()方法。就能够得到JSONArray中全部的JSONObject对象,得到了JSONObject对象。就能够将json解析为之前定义好的对象了。


总结:
开发中一般用到的几种数据模型。都在上面介绍到了,事实上仅仅要把握一个原则,看到[]解析成数组。看到{}解析成对象。那么再复杂的json数据都能够非常轻松的解析出我们想要的数据。为后面的开发作好数据准备。





版权声明:本文博客原创文章。博客,未经同意,不得转载。

Android中的应用——谷歌官方Json分析工具Gson使用的更多相关文章

  1. Android开源库--Gson谷歌官方json解析库

    官方文档地址:http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html 官方网站:http://code.go ...

  2. Android 中View的绘制机制源代码分析 三

    到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...

  3. Android中相机和相冊使用分析

    Android中相机和相冊使用分析 欢迎转载,但请尊重原创(文章来自不易,转载请标明转载出处,谢谢) 在手机应用程序中,使用自带的相机拍照以及相冊选择喜欢的图片是最常见只是的用户需求,那么怎么合理使用 ...

  4. Android 中View的绘制机制源代码分析 一

    尊重原创: http://blog.csdn.net/yuanzeyao/article/details/46765113 差点儿相同半年没有写博客了,一是由于工作比較忙,二是认为没有什么内容值得写, ...

  5. Android 中View的绘制机制源代码分析 二

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/46842891 本篇文章接着上篇文章的内容来继续讨论View的绘制机制,上篇文章中我们主要解说 ...

  6. Android中WebView的跨域漏洞分析和应用被克隆问题情景还原(免Root获取应用沙盒数据)

    一.前言 去年年底支付宝的被克隆漏洞被爆出,无独有偶就是腾讯干的,其实真正了解这个事件之后会发现,感觉是针对支付宝.因为这个漏洞找出肯定花费了很大劲,主要是因为支付宝的特殊业务需要开启了WebView ...

  7. Android中Input型输入设备驱动原理分析(一)

    转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...

  8. Android中对Log日志文件的分析[转]

    一,Bug出现了, 需要“干掉”它 bug一听挺吓人的,但是只要你懂了,android里的bug是很好解决的,因为android里提供了LOG机制,具体的底层代码,以后在来分析,只要你会看bug, a ...

  9. Android中Input型输入设备驱动原理分析<一>

    话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反正这个是没变的,在android的底层开发中对于Linux的基本驱动程序设计还是没变的,当然Android底层机制也 ...

随机推荐

  1. H264 编解码框架简单介绍

    阅读完H264/AVC 编解码器的介绍,脑海中仅仅是留下下面三条: 1.H264并没有明白规定一个编解码器怎样实现,仅仅是规定了一个编码后的视频比特流的句法,和该比特流的解码方法,这个与MPEG 类似 ...

  2. pygame系列_游戏中的事件

    先看一下我做的demo: 当玩家按下键盘上的:上,下,左,右键的时候,后台会打印出玩家所按键的数字值,而图形会随之移动 这是客观上面存在的现象. 那么啥是事件呢? 你叫我做出定义,我不知道,我只能举个 ...

  3. python学习笔记之一:列表与元组

    最近在看<python基础教程>(基于python2.x),下面总结一下第二章列表与元组的知识: 在这章中引入了数据结构的概念.数据结构是通过某种方式组织在一起的数据元素的集合.在pyth ...

  4. cocos2d 创建一个黑白纹理

    @interface myGrayTexture : CCTexture2D // @param exposure 曝光 +(id) textureWithFile:(NSString*) file ...

  5. oracle转mysql总结(转)

    ares-sdk初始开发测试使用的是oracle数据库,由于宁波通商的特殊需要,必须把数据库环境从oracle转向mysql. 现对转换过程中出现的问题及经验总结如下: 主键生成策略 创建一个专门记录 ...

  6. InputStreamReader 和 OutputStreamWriter类使用方法简单介绍,及演示。

    InputStreamReader 和 OutputStreamWriter类使用方法简单介绍. 一.InputStreamReader类 InputStreamReader 将字节流转换为字符流.是 ...

  7. REDGATE又一好用的脚本工具ScriptsManager1.3

    原文:REDGATE又一好用的脚本工具ScriptsManager1.3 REDGATE又一好用的脚本工具ScriptsManager1.3 先说明一下:这个工具是免费的 下载地址:http://ww ...

  8. Android 通过系统使用NotificationListenerService 监听各种Notification的用法

    NotificationListenerService是通过系统调起的服务,当有应用发起通知的时候,系统会将通知的动作和信息回调给NotificationListenerService. 在继承Not ...

  9. Ubuntu下hadoop2.4搭建集群(单机模式)

    一  .新建用户和用户组 注明:(这个步骤事实上能够不用的.只是单独使用一个不同的用户好一些) 1.新建用户组 sudo addgroup hadoop 2.新建用户 sudo adduser -in ...

  10. 重新想象 Windows 8 Store Apps (16) - 控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试

    原文:重新想象 Windows 8 Store Apps (16) - 控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试 [源码下载] 重新想象 Windows 8 Store ...