一文带你了解gson如何序列化子类

 更新时间:2023年10月20日 08:41:19   作者:随机的未知  
这篇文章主要为大家详细介绍了gson如何序列化子类的相关知识,文中的示例代码讲解详细,具有一定的学习和借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下

需求

目前有一个需求,不同对象有一些公共属性,分别也有一些不同的属性。对方传过来的json字符串中,把这些对象组成了一个数组返回过来的。这样该如何反序列化呢?

举例

定义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();
    }
}

解析后的内容如下:

通过解析后的内容可以发现,并不能满足我们的需求。

解决方案

自定义一个反序列化配置,用来识别父类下的各个子类,反序列化时装配其原始类型。

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();
    }
}

从序列化结果来看,已经转换成功,满足我们的要求。

到此这篇关于一文带你了解gson如何序列化子类的文章就介绍到这了,更多相关gson序列化子类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java异步调用转同步方法实例详解

    Java异步调用转同步方法实例详解

    这篇文章主要介绍了Java异步调用转同步方法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 实例讲解Java批量插入、更新数据

    实例讲解Java批量插入、更新数据

    这片文章介绍了一个Java批量添加数据,多个字段同时添加多条数据具体实例,面向的是Oracle数据库,需要的朋友可以参考下
    2015-07-07
  • java实现斐波那契数列的3种方法

    java实现斐波那契数列的3种方法

    这篇文章主要介绍了java实现斐波那契数列的3种方法,有需要的朋友可以参考一下
    2014-01-01
  • SpringBoot2.X整合Spring-Cache缓存开发的实现

    SpringBoot2.X整合Spring-Cache缓存开发的实现

    本文主要介绍了SpringBoot2.X整合Spring-Cache缓存开发的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 详解在Spring Boot中使用数据库事务

    详解在Spring Boot中使用数据库事务

    本篇文章主要介绍了详解在Spring Boot中使用数据库事务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<BR>
    2017-05-05
  • Java实现七牛云文件图片上传下载

    Java实现七牛云文件图片上传下载

    本文主要介绍了Java实现七牛云文件图片上传下载,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Spring Boot 静态资源处理

    Spring Boot 静态资源处理

    今天小编就为大家分享一篇关于Spring Boot 静态资源处理,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Java实现马踏棋盘算法

    Java实现马踏棋盘算法

    这篇文章主要为大家详细介绍了Java实现马踏棋盘算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java中的 FilterInputStream简介_动力节点Java学院整理

    Java中的 FilterInputStream简介_动力节点Java学院整理

    FilterInputStream 的作用是用来“封装其它的输入流,并为它们提供额外的功能”。接下来通过本文给大家分享Java中的 FilterInputStream简介,感兴趣的朋友一起学习吧
    2017-05-05
  • 利用Java实现玩家打怪小游戏的完整过程

    利用Java实现玩家打怪小游戏的完整过程

    这篇文章主要介绍了如何使用Java创建一个简单的“打怪小游戏”,游戏中的角色分为法师、战士、BOSS和一个Team类,代码展示了如何通过面向对象编程来实现一个基本的战斗系统,需要的朋友可以参考下
    2024-12-12

最新评论