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

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

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

需求

目前有一個需求,不同對象有一些公共屬性,分別也有一些不同的屬性。對方傳過來的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)行安全控制

    Spring Boot如何使用Spring Security進(jìn)行安全控制

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

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

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

    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的方法詳解

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

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

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

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

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

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

    Springboot極大的簡化了Spring框架的使用配置流程,在核心配置文件里,幾乎可以完成所有的配置工作,下面這篇文章主要給大家介紹了關(guān)于Spring Boot配置文件的相關(guān)資料,文中介紹的非常全面,需要的朋友可以參考下
    2018-12-12
  • Java實現(xiàn)拓?fù)渑判蛩惴ǖ氖纠a

    Java實現(xiàn)拓?fù)渑判蛩惴ǖ氖纠a

    在圖論中,拓?fù)渑判颍═opological Sorting)是一個有向無環(huán)圖(DAG, Directed Acyclic Graph)的所有頂點的線性序列。本文將為大家講講拓?fù)渑判蛩惴ǖ脑砑皩崿F(xiàn),需要的可以參考一下
    2022-07-07
  • SpringBoot整合數(shù)據(jù)庫連接池Druid的錯誤詳解

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

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

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

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

最新評論

内黄县| 乌苏市| 桂东县| 伊宁市| 乌拉特中旗| 新民市| 大竹县| 镇康县| 将乐县| 屏边| 老河口市| 汉中市| 潞西市| 运城市| 冀州市| 台北县| 扬州市| 大化| 曲靖市| 旬邑县| 女性| 讷河市| 衡阳市| 综艺| 卓尼县| 麟游县| 封开县| 化隆| 洱源县| 邛崃市| 宝鸡市| 翁牛特旗| 三都| 龙山县| 伊宁县| 衢州市| 六枝特区| 兰溪市| 紫金县| 开鲁县| 石家庄市|