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