1. 程式人生 > >使用Gson輕鬆解決複雜結構的Json資料解析

使用Gson輕鬆解決複雜結構的Json資料解析

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包

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也很好用。使用方法大同小異,具體用哪個自己決定。