Android應用之——Google官方Json解析工具Gson的使用

來源:互聯網
上載者:User

標籤:android   des   style   blog   http   java   

一、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欄位的值是一個數組,數組裡面嵌套有對象和數組。碰到這種情況,解決辦法其實很簡單,那就是將[]裡面的內容當作集合來處理,將{}裡面的內容當作對象來處理
 所以這個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資料都可以很輕鬆的解析出我們想要的資料,為後面的開發作好資料準備。






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.