亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文帶你了解gson如何序列化子類(lèi)

 更新時(shí)間:2023年10月20日 08:41:19   作者:隨機(jī)的未知  
這篇文章主要為大家詳細(xì)介紹了gson如何序列化子類(lèi)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)和借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

需求

目前有一個(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í)例詳解

    這篇文章主要介紹了Java異步調(diào)用轉(zhuǎn)同步方法實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 實(shí)例講解Java批量插入、更新數(shù)據(jù)

    實(shí)例講解Java批量插入、更新數(shù)據(jù)

    這片文章介紹了一個(gè)Java批量添加數(shù)據(jù),多個(gè)字段同時(shí)添加多條數(shù)據(jù)具體實(shí)例,面向的是Oracle數(shù)據(jù)庫(kù),需要的朋友可以參考下
    2015-07-07
  • java實(shí)現(xiàn)斐波那契數(shù)列的3種方法

    java實(shí)現(xiàn)斐波那契數(shù)列的3種方法

    這篇文章主要介紹了java實(shí)現(xiàn)斐波那契數(shù)列的3種方法,有需要的朋友可以參考一下
    2014-01-01
  • SpringBoot2.X整合Spring-Cache緩存開(kāi)發(fā)的實(shí)現(xiàn)

    SpringBoot2.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ù)

    本篇文章主要介紹了詳解在Spring?Boot中使用數(shù)據(jù)庫(kù)事務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>
    2017-05-05
  • Java實(shí)現(xiàn)七牛云文件圖片上傳下載

    Java實(shí)現(xiàn)七牛云文件圖片上傳下載

    本文主要介紹了Java實(shí)現(xiàn)七牛云文件圖片上傳下載,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Spring Boot 靜態(tài)資源處理

    Spring Boot 靜態(tài)資源處理

    今天小編就為大家分享一篇關(guān)于Spring Boot 靜態(tài)資源處理,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Java實(shí)現(xiàn)馬踏棋盤(pán)算法

    Java實(shí)現(xiàn)馬踏棋盤(pán)算法

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)馬踏棋盤(pán)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java中的 FilterInputStream簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java中的 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實(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

最新評(píng)論