一个、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. 怎样在屏幕上显示多个alv

    本文解说怎样在屏幕上显示多个alv. 实现这种需求关键是下面几点(举例:在屏幕上显示4个alv): 1.须要定义4个alv control 2.由于有4个alv control,于是就须要定义4个容器 ...

  2. _00019 Storm架构介绍和Storm获取案例(简单的官方网站Java案例)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

  3. VMware WorkStation安装时提示The MSI failed

    以前安装过其他版本的VMware workstation卸载不完全造成的 先把所有VMware相关服务关闭,然后打开注册表,搜索所有VMware相关键值,删除掉,然后再安装就可以了 前提是你机器上没有 ...

  4. POJ 2299 Ultra-QuickSort (求序列的逆序对数)

    题意:废话了一大堆就是要你去求一个序列冒泡排序所需的交换的次数. 思路:实际上是要你去求一个序列的逆序队数 看案例: 9 1 0 5 4 9后面比它小的的数有4个 1后面有1个 0后面没有 5后面1个 ...

  5. Java集合类汇总记录-- apache.commons4(TreeList)

    通常.Tree是Tree,List是List,两者不太可能混在一起.但apache-commons库却用tree实现了实现了List的接口,也就是TreeList类.与标准的LinkedList相比. ...

  6. Android点滴---ViewHolder通用,优雅写法

    近期在做项目时,又要写 ViewHolder. 突然想到网上看看有没什么好的写法! 不知道你是不是也烦透了写那些没有技术含量的ViewHolder 看看这些.也许会有收获! 然后就找到了以下两篇文章( ...

  7. python学习笔记之五:抽象

    本文会介绍如何将语句组织成函数,还会详细介绍参数和作用域的概念,以及递归的概念及其在程序中的用途. 一. 创建函数 函数是可以调用,它执行某种行为并且返回一个值.用def语句即可定义一个函数:(并非所 ...

  8. java 配置及安装Eclipse

    jdk下载 点我~ Java SE Development Kit 8u20 You must accept the Oracle Binary Code License Agreement for ...

  9. 从字节码层面看“HelloWorld” (转)

    一.HelloWorld 字节码生成 众所周知,Java 程序是在 JVM 上运行的,不过 JVM 运行的其实不是 Java 语言本身,而是 Java 程序编译成的字节码文件.可能一开始 JVM 是为 ...

  10. Android SwipeRefreshLayout 官方下拉刷新控件介绍

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24521483 下面App基本都有下拉刷新的功能,以前基本都使用XListView ...