欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文帶你了解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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java異步調(diào)用轉(zhuǎn)同步方法實例詳解

    Java異步調(diào)用轉(zhuǎn)同步方法實例詳解

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

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

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

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

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

    SpringBoot2.X整合Spring-Cache緩存開發(fā)的實現(xiàn)

    本文主要介紹了SpringBoot2.X整合Spring-Cache緩存開發(fā)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 詳解在Spring?Boot中使用數(shù)據(jù)庫事務

    詳解在Spring?Boot中使用數(shù)據(jù)庫事務

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

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

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

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

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

    Java實現(xiàn)馬踏棋盤算法

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

    Java中的 FilterInputStream簡介_動力節(jié)點Java學院整理

    FilterInputStream 的作用是用來“封裝其它的輸入流,并為它們提供額外的功能”。接下來通過本文給大家分享Java中的 FilterInputStream簡介,感興趣的朋友一起學習吧
    2017-05-05
  • 利用Java實現(xiàn)玩家打怪小游戲的完整過程

    利用Java實現(xiàn)玩家打怪小游戲的完整過程

    這篇文章主要介紹了如何使用Java創(chuàng)建一個簡單的“打怪小游戲”,游戲中的角色分為法師、戰(zhàn)士、BOSS和一個Team類,代碼展示了如何通過面向?qū)ο缶幊虂韺崿F(xiàn)一個基本的戰(zhàn)斗系統(tǒng),需要的朋友可以參考下
    2024-12-12

最新評論