最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你了解gson如何序列化子類

 更新時間:2023年10月20日 08:41:19   作者:隨機的未知  
這篇文章主要為大家詳細介紹了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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring Boot如何使用Spring Security進行安全控制

    Spring Boot如何使用Spring Security進行安全控制

    要實現(xiàn)訪問控制的方法多種多樣,可以通過Aop、攔截器實現(xiàn),也可以通過框架實現(xiàn),本文將具體介紹在Spring Boot中如何使用Spring Security進行安全控制。
    2017-04-04
  • Java實現(xiàn)視頻時間維度剪切的工具類

    Java實現(xiàn)視頻時間維度剪切的工具類

    這篇文章主要為大家詳細介紹了將視頻按照時間維度進行剪切的Java工具類,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • Java持久化框架Hibernate與Mybatis優(yōu)劣及選擇詳解

    Java持久化框架Hibernate與Mybatis優(yōu)劣及選擇詳解

    這篇文章主要介紹了Java持久化框架Hibernate與Mybatis優(yōu)劣及選擇詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • java 三種將list轉(zhuǎn)換為map的方法詳解

    java 三種將list轉(zhuǎn)換為map的方法詳解

    這篇文章主要介紹了java 三種將list轉(zhuǎn)換為map的方法詳解的相關資料,需要的朋友可以參考下
    2017-01-01
  • Spring Boot集成ShedLock分布式定時任務的實現(xiàn)示例

    Spring Boot集成ShedLock分布式定時任務的實現(xiàn)示例

    ShedLock確保您計劃的任務最多同時執(zhí)行一次。如果一個任務正在一個節(jié)點上執(zhí)行,則它會獲得一個鎖,該鎖將阻止從另一個節(jié)點(或線程)執(zhí)行同一任務。
    2021-05-05
  • Spring Boot 排除某個類加載注入IOC的操作

    Spring Boot 排除某個類加載注入IOC的操作

    這篇文章主要介紹了Spring Boot 排除某個類加載注入IOC的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 史上最全面的Spring Boot配置文件深入講解

    史上最全面的Spring Boot配置文件深入講解

    Springboot極大的簡化了Spring框架的使用配置流程,在核心配置文件里,幾乎可以完成所有的配置工作,下面這篇文章主要給大家介紹了關于Spring Boot配置文件的相關資料,文中介紹的非常全面,需要的朋友可以參考下
    2018-12-12
  • Java實現(xiàn)拓撲排序算法的示例代碼

    Java實現(xiàn)拓撲排序算法的示例代碼

    在圖論中,拓撲排序(Topological Sorting)是一個有向無環(huán)圖(DAG, Directed Acyclic Graph)的所有頂點的線性序列。本文將為大家講講拓撲排序算法的原理及實現(xiàn),需要的可以參考一下
    2022-07-07
  • SpringBoot整合數(shù)據(jù)庫連接池Druid的錯誤詳解

    SpringBoot整合數(shù)據(jù)庫連接池Druid的錯誤詳解

    文章總結(jié)了幾種SpringBoot整合Druid時遇到的問題及其解決方法,主要問題有:缺少jar包導致系統(tǒng)停止和ClassNotFoundException,通過添加缺少的jar包可以解決問題,同時提醒注意數(shù)據(jù)庫配置信息的正確性和避免jar包沖突
    2026-04-04
  • 零基礎全面解析SpringBoot配置文件(結(jié)合驗證碼案例)

    零基礎全面解析SpringBoot配置文件(結(jié)合驗證碼案例)

    文章介紹配置文件的作用及SpringBoot中properties和yml格式的使用,比較其優(yōu)缺點,并演示基于Hutool的驗證碼生成與校驗實現(xiàn),本文結(jié)合驗證碼案例給大家詳細講解,感興趣的朋友跟隨小編一起看看吧
    2025-09-09

最新評論

玉林市| 芮城县| 沂源县| 垦利县| 久治县| 南通市| 鹰潭市| 阿鲁科尔沁旗| 尼木县| 平果县| 章丘市| 临桂县| 东阿县| 新宁县| 南宁市| 武陟县| 仁化县| 龙里县| 屏山县| 南通市| 咸阳市| 沐川县| 平乡县| 鄂尔多斯市| 大英县| 利川市| 南投县| 沅陵县| 东台市| 鄄城县| 乐至县| 南开区| 云龙县| 义乌市| 五莲县| 手游| 论坛| 莒南县| 舞阳县| 岳阳县| 开远市|