Gson是Google在2008年就推出的一套Library
目的是提供開發者快速的將JSON字串(String)轉換成物件(Object)
以及將物件(Object)快速的轉換成JSON字串(String)
目前release到v2.8.1
Gradle:
//gson
compile 'com.google.code.gson:gson:2.8.1'
假設我們有這樣一組JSON字串要轉換成Object
[
{
"UserName":"Anson",
"UserAge":20
},
{
"UserName":"Kevin",
"UserAge":30
}
]
可以看出是由一個JSONArray包住兩個JSONObject
JSONObject裡面有兩個屬性,分別是UserName 與 UserAge
於是乎我們便定義了這樣的一個 Model 來裝這些資料
public class User {
private String UserName;
private int UserAge;
public User(String userName, int userAge) {
UserName = userName;
UserAge = userAge;
}
public String getUserName() {
return UserName;
}
public int getUserAge() {
return UserAge;
}
}
使用Gson將 JSON字串 轉換成 Array
只需要簡單一行就搞定!
String jsonString = "[{\"UserName\":\"Anson\",\"UserAge\":20},{\"UserName\":\"Kevin\",\"UserAge\":30}]";
User[] userArray = new Gson().fromJson(jsonString, User[].class);
如果想轉成 List 呢?
String jsonString = "[{\"UserName\":\"Anson123123\",\"UserAge\":20},{\"UserName\":\"Kevin\",\"UserAge\":30}]";
java.lang.reflect.Type listType = new TypeToken<Collection<User>>(){}.getType();
List<User> userList = new Gson().fromJson(jsonString , listType);
那如果是物件轉JSON字串呢?
也是很簡單~~
ArrayList<User> userList = new ArrayList();
for (int i=0;i<2;i++){
User user = new User("Test"+i,i);
userList.add(user);
}
String jsonString = new Gson().toJson(userList);
System.out.println(jsonString);
輸出結果:
[{"UserName":"Test0","UserAge":0},{"UserName":"Test1","UserAge":1}]
有發現上面的User class中
在第2.3行我們所定義的屬性為 UserName 與 UserAge 嗎
名子跟JSON裡面的屬性一樣
但這不符合JAVA中的命名規範(小寫開頭)
那如果我們將class中的屬性改成userName 與 userAge
在進行轉換時就會失敗~因為大小寫與JSON字串不一致
於是我們可以加上Gson提供的一個很方便的功能
@SerializedName("對應的JSON屬性名稱")
我們可以將 model 改成這個樣子...
public class User {
@SerializedName("UserName")
private String name;
@SerializedName("UserAge")
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
這樣子就等於告訴Gson,在轉換JSON字串時需要將 Model 內的
name ⇒ UserName
age ⇒ UserAge
以及在 JSON字串 轉 物件 時,將
UserName ⇒ name
UserAge ⇒ age
來試試複雜一點的例子吧:
{
"Id":123456,
"Name":"張三",
"Gender":true,
"Phones":[
{"Type":"Landline","Number":"02-2800-0000"},
{"Type":"Mobile","Number":"0900-000-000"}
],
"Hobbies":[
"釣魚","睡覺","打籃球"
]
}
這組 JSON 裡面可以看出,這是在描述一個人
他叫做張三,性別男(假設男為true,女為false),電話有兩支,一支市話一支手機
興趣有三個,分別是釣魚.睡覺.打籃球
來定義 Model 吧:
public class Guest {
@SerializedName("Id")
private int id;
@SerializedName("Name")
private String name;
@SerializedName("Gender")
private boolean gender;
@SerializedName("Phones")
private List<Phone> phoneList;
@SerializedName("Hobbies")
private List<String> hobbyList;
public int getId() {
return id;
}
public String getName() {
return name;
}
public boolean getGender() {
return gender;
}
public List<Phone> getPhoneList() {
return phoneList;
}
public List<String> getHobbyList() {
return hobbyList;
}
@Override
public String toString() {
return new Gson().toJson(this, Guest.class);
}
public static class Phone {
enum Type {
Landline, Mobile
}
@SerializedName("Type")
private Type type;
@SerializedName("Number")
private String number;
public Type getType() {
return type;
}
public String getNumber() {
return number;
}
}
}
在這個 Guest 這個 class 中
先使用 SerializedName 將原本 JSON字串 的屬性名稱轉換成我們想要的名子
接著在42行定義了一個 inner class 來裝電話的資料(當然不一定要使用內部類)
可以看到43行 列舉(enum) 也是可以在 gson 轉換中直接使用的
在38行我 override 了 toString 方法,目的是印 log 比較方便
定義好了 Model 後,接著的資料轉換就輕鬆多了!
String jsonString = "{\"Id\":123456,\"Name\":\"張三\",\"Gender\":true,\"Phones\":[{\"Type\":\"Landline\",\"Number\":\"02-2800-0000\"},{\"Type\":\"Mobile\",\"Number\":\"0900-000-000\"}],\"Hobbies\":[\"釣魚\",\"睡覺\",\"打籃球\"]}";
Guest guest = new Gson().fromJson(jsonString, Guest.class);
System.out.println(guest.toString());
也是一行輕鬆搞定
輸出結果:
{"Gender":true,"Hobbies":["釣魚","睡覺","打籃球"],"Id":123456,"Name":"張三","Phones":[{"Number":"02-2800-0000","Type":"Landline"},{"Number":"0900-000-000","Type":"Mobile"}]}
與Gson類似的Library還可以參考FasterXML jackson