一文帶你了解gson如何序列化子類
需求
目前有一個需求,不同對象有一些公共屬性,分別也有一些不同的屬性。對方傳過來的json字符串中,把這些對象組成了一個數(shù)組返回過來的。這樣該如何反序列化呢?
舉例
定義Person類、Student類、Worker類;
@Data
@ToString
public class Person {
//姓名
private String name;
//年齡
private Integer age;
//類型,0代表Student,1代表worker
private Integer type;
}
@Data
@ToString
public class Student extends Person{
//學(xué)校
private String school;
}
@Data
@ToString
public class Worker extends Person{
//薪水
private Integer salary;
}
字符串為:
{
"group":[
{
"school":"Hello中學(xué)",
"name":"張三",
"age":16,
"type":0
},
{
"salary":100000,
"name":"李四",
"age":35,
"type":1
}
]
}
如果我們直接使用Gson來解析,解析代碼如下:
public class MyTest {
public static void main(String[] args) {
Gson gson = new Gson();
String jsonStr = "{\"group\":[{\"school\":\"Hello中學(xué)\",\"name\":\"張三\",\"age\":16,\"type\":0},{\"salary\":100000,\"name\":\"李四\",\"age\":35,\"type\":1}]}";
Type type = new TypeToken<PersonGroup>() {
}.getType();
PersonGroup personGroup = gson.fromJson(jsonStr, type);
//為了打斷點
System.out.println();
}
}
解析后的內(nèi)容如下:

通過解析后的內(nèi)容可以發(fā)現(xiàn),并不能滿足我們的需求。
解決方案
自定義一個反序列化配置,用來識別父類下的各個子類,反序列化時裝配其原始類型。
public class PersonDesrializer implements JsonDeserializer<Person> {
private Gson gson = new Gson();
private Map<Integer, Class<? extends Person>> typeMap = new HashMap<>();
public PersonDesrializer() {
typeMap.put(0,Student.class);
typeMap.put(1,Worker.class);
}
@Override
public Person deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
JsonObject jsonObject = jsonElement.getAsJsonObject();
Class<? extends Person> typeClazz = this.typeMap.get(jsonObject.get("type").getAsInt());
return gson.fromJson(jsonElement,typeClazz);
}
}
反序列化方式如下:
public class MyTest {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.serializeNulls()
.registerTypeAdapter(Person.class, new PersonDesrializer())
.create();
String jsonStr = "{\"group\":[{\"school\":\"Hello中學(xué)\",\"name\":\"張三\",\"age\":16,\"type\":0},{\"salary\":100000,\"name\":\"李四\",\"age\":35,\"type\":1}]}";
Type type = new TypeToken<PersonGroup>() {
}.getType();
PersonGroup personGroup = gson.fromJson(jsonStr, type);
//為了打斷點
System.out.println();
}
}

從序列化結(jié)果來看,已經(jīng)轉(zhuǎn)換成功,滿足我們的要求。
到此這篇關(guān)于一文帶你了解gson如何序列化子類的文章就介紹到這了,更多相關(guān)gson序列化子類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java異步調(diào)用轉(zhuǎn)同步方法實例詳解
這篇文章主要介紹了Java異步調(diào)用轉(zhuǎn)同步方法實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
SpringBoot2.X整合Spring-Cache緩存開發(fā)的實現(xiàn)
本文主要介紹了SpringBoot2.X整合Spring-Cache緩存開發(fā)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
詳解在Spring?Boot中使用數(shù)據(jù)庫事務(wù)
本篇文章主要介紹了詳解在Spring?Boot中使用數(shù)據(jù)庫事務(wù),具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>2017-05-05
Java中的 FilterInputStream簡介_動力節(jié)點Java學(xué)院整理
FilterInputStream 的作用是用來“封裝其它的輸入流,并為它們提供額外的功能”。接下來通過本文給大家分享Java中的 FilterInputStream簡介,感興趣的朋友一起學(xué)習(xí)吧2017-05-05

