一文帶你了解gson如何序列化子類(lèi)
需求
目前有一個(gè)需求,不同對(duì)象有一些公共屬性,分別也有一些不同的屬性。對(duì)方傳過(guò)來(lái)的json字符串中,把這些對(duì)象組成了一個(gè)數(shù)組返回過(guò)來(lái)的。這樣該如何反序列化呢?
舉例
定義Person類(lèi)、Student類(lèi)、Worker類(lèi);
@Data @ToString public class Person { //姓名 private String name; //年齡 private Integer age; //類(lèi)型,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來(lái)解析,解析代碼如下:
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); //為了打斷點(diǎn) System.out.println(); } }
解析后的內(nèi)容如下:
通過(guò)解析后的內(nèi)容可以發(fā)現(xiàn),并不能滿足我們的需求。
解決方案
自定義一個(gè)反序列化配置,用來(lái)識(shí)別父類(lèi)下的各個(gè)子類(lèi),反序列化時(shí)裝配其原始類(lèi)型。
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); //為了打斷點(diǎn) System.out.println(); } }
從序列化結(jié)果來(lái)看,已經(jīng)轉(zhuǎn)換成功,滿足我們的要求。
到此這篇關(guān)于一文帶你了解gson如何序列化子類(lèi)的文章就介紹到這了,更多相關(guān)gson序列化子類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java異步調(diào)用轉(zhuǎn)同步方法實(shí)例詳解
這篇文章主要介紹了Java異步調(diào)用轉(zhuǎn)同步方法實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06實(shí)例講解Java批量插入、更新數(shù)據(jù)
這片文章介紹了一個(gè)Java批量添加數(shù)據(jù),多個(gè)字段同時(shí)添加多條數(shù)據(jù)具體實(shí)例,面向的是Oracle數(shù)據(jù)庫(kù),需要的朋友可以參考下2015-07-07java實(shí)現(xiàn)斐波那契數(shù)列的3種方法
這篇文章主要介紹了java實(shí)現(xiàn)斐波那契數(shù)列的3種方法,有需要的朋友可以參考一下2014-01-01SpringBoot2.X整合Spring-Cache緩存開(kāi)發(fā)的實(shí)現(xiàn)
本文主要介紹了SpringBoot2.X整合Spring-Cache緩存開(kāi)發(fā)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07詳解在Spring?Boot中使用數(shù)據(jù)庫(kù)事務(wù)
本篇文章主要介紹了詳解在Spring?Boot中使用數(shù)據(jù)庫(kù)事務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>2017-05-05Java中的 FilterInputStream簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
FilterInputStream 的作用是用來(lái)“封裝其它的輸入流,并為它們提供額外的功能”。接下來(lái)通過(guò)本文給大家分享Java中的 FilterInputStream簡(jiǎn)介,感興趣的朋友一起學(xué)習(xí)吧2017-05-05利用Java實(shí)現(xiàn)玩家打怪小游戲的完整過(guò)程
這篇文章主要介紹了如何使用Java創(chuàng)建一個(gè)簡(jiǎn)單的“打怪小游戲”,游戲中的角色分為法師、戰(zhàn)士、BOSS和一個(gè)Team類(lèi),代碼展示了如何通過(guò)面向?qū)ο缶幊虂?lái)實(shí)現(xiàn)一個(gè)基本的戰(zhàn)斗系統(tǒng),需要的朋友可以參考下2024-12-12