使用Gson輕鬆解決複雜結構的Json數據解析

轉載請註明來源: http://blog.csdn.net/kjunchen/article/details/50961803

JSON簡介

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。JSON 是存儲和交換文本信息的語法,類似XML,但是比XML更小、更快,更易解析。


JSON語法

JSON構建於兩種結構:

  • “名稱/值”對的集合(A collection of name/value pairs)。不同的編程語言中,它被理解爲對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array)。

  • 值的有序列表(An ordered list of values)。在大部分語言中,它被實現爲數組(array),矢量(vector),列表(list),序列(sequence)。

對象(object) 是一個無序的“‘名稱/值’對”集合。一個對象以“ { ”(左括號)開始,“ } ”(右括號)結束。每個“名稱”後跟一個“ : ”(冒號);“‘名稱/值’ 對”之間使用“ , ”(逗號)分隔。通過對象.名稱獲取值,值的類型可以是數字、字符串、數組、對象幾種。

數組(array) 是值(value)的有序集合。一個數組以“ [ ”(左中括號)開始,“ ] ”(右中括號)結束。值之間使用“ , ”(逗號)分隔。使用索引獲取,值的類型可以是數字、字符串、數組、對象幾種。

經過對象、數組兩種結構可以組合成複雜的數據結構。

json語法規則是:數據在鍵值對中,數據由逗號分隔,花括號保存對象,方括號保存數組。

json數據書寫格式是:名稱/值。名稱寫在前面,值寫在後面,都在雙引號中,中間用冒號隔開。如

"name":"JunkChen"

json的值可以是:數字(整數或浮點數)、 字符串(在雙引號中)、邏輯值(true或false)、 數組(在方括號中)、 對象(在花括號中)、 null


Json數據示例

Json對象

{
    "firstName":"Junk",
    "lastNmae":"Chen",
    "sex":"male",
    "age":23
}

那麼,如何取值呢?假設我們給這個對象取名personObj,personObj.firstName = Junk , personObj.age = 23 。

如果用xml表示,如:

<?xml version="1.0" encoding="utf-8"?>
<person>
    <firstName>Junk</firstName>
    <lastName>Chen</lastName>
    <sex>male</sex>
    <sec>23</sex>
</person>

使用xml描述就比Json顯得臃腫,xml中都是標記對形式,數據量肯定比Json大。如果用Json數組表示那就更簡單了(如下)。

Json數組

[
    "Junk","Chen","male",23
]

如果這個數組取名爲personArray,則 personArray[0] = Junk, personArray[2] = male 。

複合結構

{
    "person":["Junk","Chen","male",23],
    "cat":
    {
        "name":"Jon",
        "age":3
    },
    "province":
    [{
        "name":"廣東",
        "cities":["深圳","廣州","珠海"]
    },
    {
        "name":"陝西",
        "cities":["西安","漢中","咸陽"]
    }]
}  

這個示例中,首先是一個Json對象,對象裏面包含Json數組,Json數組裏面又包含有Json對象,這樣就構成了一個複雜結構的Json數據。


使用Gson快速解析Json數據

解析簡單的Json數據使用JsonObject和JsonArray還可以,但是遇到複雜結構的Json數據,就很費力了,這時我們可以採用Gson進行Json數據解析。Gson是谷歌推出的Json解析的工具包。接下來就看個實例:

1、導入Gson jar包

下載Gson jar包,新建Java工程將下載jar包導入自己的工程。
Gson 2.6.2 Jar包下載: http://download.csdn.net/detail/kjunchen/9469938   
最新版Gson下載查找:https://github.com/google/gson

2、創建Java Bean類

新建Cat類,如下:
Cat.java

package me.jc.gson;

public class Cat {
    private String name;
    private String sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Cat(String name, String sex) {
        super();
        this.name = name;
        this.sex = sex;
    }

    public Cat() {
        super();
    }

    @Override
    public String toString() {
        return "Cat [name=" + name + ", sex=" + sex + "]";
    }

}

Cat類中設置字段名爲name和sex。

新建Dog類,如下:
Dog.java

package me.jc.gson;

public class Dog {
    private String name;
    private int age;

    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 Dog(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public Dog() {
        super();
    }

    @Override
    public String toString() {
        return "Dog [name=" + name + ", age=" + age + "]";
    }

}

Dog類中同樣設置字段名爲name和sex。

新建Person類,如下:
Person.java

package me.jc.gson;

import java.util.Arrays;

public class Person {
    private int id;
    private String name;
    private String sex;
    private long[] phone;
    private Cat cat;
    private Object object;

    public Person() {
    }

    public Person(int id, String name, String sex) {
        super();
        this.id = id;
        this.name = name;
        this.sex = sex;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public long[] getPhone() {
        return phone;
    }

    public void setPhone(long[] phone) {
        this.phone = phone;
    }

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    public Object getObject() {
        return object;
    }

    public void setObject(Object object) {
        this.object = object;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", sex=" + sex
                + ", phone=" + Arrays.toString(phone) + ", cat=" + cat
                + ", object=" + object + "]";
    }

}

Person類中設置字段名爲id、name、sex、phone、cat、object,這個Person中包含了Cat對象,還有個Object對象,從而構成了一個相對複雜的對象。到目前爲止,似乎好像跟Json沒什麼關係,那麼接下來我們看看如何使用Gson解析Json數據。

注意:

  • 1、如果Java Bean類中有內部嵌套的類必須用static進行修飾;
  • 2、類中的屬性名必須跟Json字段裏面的名稱(Key)是一樣的。

3、使用Gson解析Json

新建測試類GsonTest,創建Gson對象,Gson提供toJson()方法將一個JavaBean實例對象轉換成Json數據,通過Gson.fromJson()方法將Json數據還原成JavaBean實例對象。

GsonTest.java

package me.jc.gson;

import com.google.gson.Gson;

public class GsonTest {

    public static void main(String[] args) {
        Gson gson = new Gson();//實例化Gson對象

        Person person = new Person(1, "JunkChen", "male");//實例化Person對象
        person.setPhone(new long[] { 17802900000l, 17802900001l });
        Cat cat = new Cat("wangwang", "female");//實例化Cat對象
        Dog dog = new Dog();//實例化Dog對象
        dog.setAge(20);
        person.setCat(cat);
        person.setObject(dog);
        System.out.println(gson.toJson(person));//將Person對象轉換成Json對象數據
        System.out.println();

        String json = "{\"phone\":[17802900000, 17802900001],\"id\":1,\"cat\":{\"name\":\"wangwang\"},\"sex\":\"female\",\"name\":\"Junk\",\"object\":{\"name\":\"doggg\",\"age\":12}}";//Json格式的數據
        Person fromJson = gson.fromJson(json, Person.class);//使用Gson將Json數據轉換成Person對象
        System.out.println(fromJson.toString());
        System.out.println();

        System.out.println(gson.fromJson(gson.toJson(fromJson.getObject()), Dog.class));
    }
}

運行結果如下圖所示:

OK,如果你之前是使用JsonObjectJsonArray進行Json數據解析的,那麼看了這個是不是覺得Json數據解析很簡單呢。只要根據Json數據創建相應的Java Bean對象,然後使用Gson輕輕鬆鬆搞定Json數據解析。趕快去試試吧。

Json解析的工具類還有很多,除了谷歌Gson外,還有阿里的FastJson也很好用。使用方法大同小異,具體用哪個自己決定。


歡迎加qq羣討論:365532949
HomePage:http://junkchen.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章