Google的JSON解析庫Gson的使用
阿新 • • 發佈:2019-01-02
該專案的github地址:Gson
JsonObject的解析
比如你有下面這樣的一個JsonObject:
{ "_id":"OXBGzgE9exNkAP6v8reFIDcZOwrG27MInNXZ4aRXSQUX2GK7OD3i7qXj3HmeYOGg", "ttl":7200, "created":'2015-12-16T10:51:28.845Z', "userId":'5671423088147fb8e63e1d42', "name":"某某", "school":"某某", "phone":"某某", "sign":"某某" }
先定義一個與其對應的類,如下所示:
public class User {
private String _id;
private String ttl;
private String created;
private String userId;
private String name;
private String school;
private String phone;
private String sign;
//省略get,set,可以通過IDE快速生成
}
然後一句程式碼搞定:
//其中的s是你從伺服器獲取的JSON字串 User user = new Gson().fromJson(s, User.class);
再看一種情況,如果的你的JsonObject變成下面這樣:
{ "_id": "OXBGzgE9exNkAP6v8reFIDcZOwrG27MInNXZ4aRXSQUX2GK7OD3i7qXj3HmeYOGg", "ttl": 7200, "created": '2015-12-16T10:51:28.845Z', "userId": '5671423088147fb8e63e1d42', "user": { "name": "某某", "school": "某某", "phone": "某某", "sign": "某某" } }
你可以通過內部類來解決,定義的與其對應的類如下:
public class Person {
private String _id;
private String ttl;
private String created;
private String userId;
private User user;
class User {
private String name;
private String school;
private String phone;
private String sign;
//省略get,set,可以通過IDE快速生成
}
//省略get,set,可以通過IDE快速生成
}
用法同上,如下:
//其中的s是你從伺服器獲取的JSON字串
Person person = new Gson().fromJson(s, Person.class);
System.out.println(person.get_id());
System.out.println(person.getUser().getName());//獲取內部類的資料
JsonArray的解析
比如你有下面這樣的一個JsonArray:
[
{
"title": "活動1",
"authorName": "測試1",
"id": "5672b729337626dd96fb52a2",
"authorId": "5672b3f5337626dd96fb52a0",
"keyword": "關鍵字:招新,報名,後端,Android",
"imgUrl": "http://etuan.oss-cn-hangzhou.aliyuncs.com/images/551e910a8e3e731c230d8021/logo/1439479222561196823.png",
"created": "2015-12-03T16:00:00.000Z",
"started": "2015-12-03T16:00:00.000Z",
"ended": "2015-12-03T16:00:00.000Z"
},
{
"title": "活動2",
"authorName": "測試2",
"id": "5672b96a88b7c0a97d0259b3",
"authorId": "5672b3f5337626dd96fb52a0",
"keyword": "關鍵字:招新,報名,後端,Android",
"imgUrl": "http://etuan.oss-cn-hangzhou.aliyuncs.com/images/551e910a8e3e731c230d8021/logo/1439479222561196823.png",
"created": "2015-12-03T16:00:00.000Z",
"started": "2015-12-03T16:00:00.000Z",
"ended": "2015-12-03T16:00:00.000Z"
}
]
同樣,先定義一個與其對應的類,如下所示:
import java.util.List;
public class Activties {
private List<Activity> activities;
class Activity {
private String title;
private String authorName;
private String id;
private String authorId;
private String keyword;
private String imgUrl;
private String created;
private String started;
private String ended;
//省略get,set,可以通過IDE快速生成
}
//省略get,set,可以通過IDE快速生成
}
不過這裡解析的程式碼有所不同,按照Gson User Guide這裡的說法應該是和Java泛型的型別擦除有關,解析程式碼示例如下:
//其中的s是你從伺服器獲取的JSON字串
List<Activties.Activity> activityList = new Gson().fromJson(s,
new TypeToken<List<Activties.Activity>>(){}.getType());
System.out.println(activityList.get(0).getTitle());
System.out.println(activityList.get(1).getTitle());
JsonObject和JsonArray互相多層巢狀的解析
比如你有下面這樣的一個JSON字串要解析:
{
"a":"a_value",
"b":
[
{"b1":"b1_value1","b2":"b2_value1"},
{"b1":"b1_value2","b2":"b2_value2"}
],
"c":
{
"c1":"c1_value",
"c2":"c2_value",
"c3":
[
{"c31":"c31_value1","c32":"c32_value1"},
{"c31":"c31_value2","c32":"c32_value2"}
]
}
}
其實也就是多套幾層內部類而已,對應類如下:
import java.util.List;
public class JsonBean {
public String a;
public List<B> b;
public C c;
class B {
private String b1;
private String b2;
public String getB1() {
return b1;
}
public String getB2() {
return b2;
}
}
class C {
private String c1;
private String c2;
private List<C3> c3;
class C3 {
private String c31;
private String c32;
public String getC31() {
return c31;
}
public String getC32() {
return c32;
}
}
public String getC1() {
return c1;
}
public String getC2() {
return c2;
}
public List<C3> getC3() {
return c3;
}
}
public String getA() {
return a;
}
public List<B> getB() {
return b;
}
public C getC() {
return c;
}
}
解析程式碼示例如下:
//其中的s是你從伺服器獲取的JSON字串
JsonBean jsonBean = new Gson().fromJson(s,new TypeToken<JsonBean>(){}.getType());
System.out.println(jsonBean.getA());
System.out.println(jsonBean.getB().get(0).getB1());
System.out.println(jsonBean.getC().getC1());
System.out.println(jsonBean.getC().getC3().get(1).getC31());