轉載請註明來源: 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,如果你之前是使用JsonObject和JsonArray進行Json數據解析的,那麼看了這個是不是覺得Json數據解析很簡單呢。只要根據Json數據創建相應的Java Bean對象,然後使用Gson輕輕鬆鬆搞定Json數據解析。趕快去試試吧。
Json解析的工具類還有很多,除了谷歌Gson外,還有阿里的FastJson也很好用。使用方法大同小異,具體用哪個自己決定。
歡迎加qq羣討論:365532949
HomePage:http://junkchen.com