一文帶你了解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)文章
Spring Boot如何使用Spring Security進(jìn)行安全控制
要實現(xiàn)訪問控制的方法多種多樣,可以通過Aop、攔截器實現(xiàn),也可以通過框架實現(xiàn),本文將具體介紹在Spring Boot中如何使用Spring Security進(jìn)行安全控制。2017-04-04
Java持久化框架Hibernate與Mybatis優(yōu)劣及選擇詳解
這篇文章主要介紹了Java持久化框架Hibernate與Mybatis優(yōu)劣及選擇詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
java 三種將list轉(zhuǎn)換為map的方法詳解
這篇文章主要介紹了java 三種將list轉(zhuǎn)換為map的方法詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01
Spring Boot集成ShedLock分布式定時任務(wù)的實現(xiàn)示例
ShedLock確保您計劃的任務(wù)最多同時執(zhí)行一次。如果一個任務(wù)正在一個節(jié)點上執(zhí)行,則它會獲得一個鎖,該鎖將阻止從另一個節(jié)點(或線程)執(zhí)行同一任務(wù)。2021-05-05
SpringBoot整合數(shù)據(jù)庫連接池Druid的錯誤詳解
文章總結(jié)了幾種SpringBoot整合Druid時遇到的問題及其解決方法,主要問題有:缺少jar包導(dǎo)致系統(tǒng)停止和ClassNotFoundException,通過添加缺少的jar包可以解決問題,同時提醒注意數(shù)據(jù)庫配置信息的正確性和避免jar包沖突2026-04-04
零基礎(chǔ)全面解析SpringBoot配置文件(結(jié)合驗證碼案例)
文章介紹配置文件的作用及SpringBoot中properties和yml格式的使用,比較其優(yōu)缺點,并演示基于Hutool的驗證碼生成與校驗實現(xiàn),本文結(jié)合驗證碼案例給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧2025-09-09

