Gson 是 Google 在2008年就推出的一套Library,目的是提供開發者快速的將JSON字串(String)轉換成物件(Object),以及將物件(Object)快速的轉換成JSON字串(String),目前release到 v2.5
dependency 位址
compile 'com.google.code.gson:gson:2.5'
假設我們有這樣一組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
也是一個挺牛B的lib...