使用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,如果你之前是使用JsonObject和JsonArray進行Json資料解析的,那麼看了這個是不是覺得Json資料解析很簡單呢。只要根據Json資料建立相應的Java Bean物件,然後使用Gson輕輕鬆鬆搞定Json資料解析。趕快去試試吧。
Json解析的工具類還有很多,除了谷歌Gson外,還有阿里的FastJson也很好用。使用方法大同小異,具體用哪個自己決定。