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如何序列化子类的更多相关文章
- 【boost】使用serialization库序列化子类
boost.serialization库是一个非常强大又易用的序列化库,用于对象的保存与持久化等. 使用base_object可以在序列化子类的同时也序列化父类,以此获得足够的信息来从文件或网络数据中 ...
- Gson手动序列化POJO(工具类)
gson2.7版本 只是简单的工具类(练习所用): package pojo; import javax.xml.bind.annotation.XmlSeeAlso; import com.goog ...
- SpringMVC+GSON 对象序列化--日期格式的处理
Gson异常强大因此使用它代替了Jackson作为SpringMVC消息转换器. 在自己的项目中,发现对象在序列化后,日期格式出现了问题. 先看问题 在员工表中有一列是生日,字段类型为Date,也就是 ...
- Gson的序列化和反序列化-待更新
反序列化为List List<Person> persons =gson.fromJson(json, new TypeToken<List<Person>>() ...
- Gson序列化对象如何忽略字段
Gson序列化对象如何忽略字段 Gson版本 2.8.2 梗概 用注解@Expose(serialize = false, deserialize = false)在类的成员上以告诉Gson 跳过本字 ...
- gson中TypeAdapter实现自定义序列化操作
最近在项目中遇到这么一个问题,我们后台需要向前端返回一个 json 数据,就是将一个地理位置对象以json的格式返回到前台,但是这个地理位置对象中的经纬度是Double数据类型,项目中规定,如果经纬度 ...
- java基础知识-序列化/反序列化-gson基础知识
以下内容来之官网翻译,地址 1.Gson依赖 1.1.Gradle/Android dependencies { implementation 'com.google.code.gson:gson:2 ...
- GSON TypeToken 解决泛型问题
Java进阶(四)Java反射TypeToken解决泛型运行时类型擦除的问题解决 在开发时,遇到了下面这条语句,不懂,然习之. private List<MyZhuiHaoDetailModel ...
- Gson 使用总结 高级用法
Gson基本用法 参考:http://www.jianshu.com/p/e740196225a4 Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列 ...
- 【转】采用Gson解析含有多种JsonObject的复杂json
本文对应的项目是MultiTypeJsonParser ,项目地址 https://github.com/sososeen09/MultiTypeJsonParser 0 前奏 使用 Gson 去解析 ...
随机推荐
- Python史上最全种类数据库操作方法,你能想到的数据库类型都在里面!甚至还有云数据库!
本文将详细探讨如何在Python中连接全种类数据库以及实现相应的CRUD(创建,读取,更新,删除)操作.我们将逐一解析连接MySQL,SQL Server,Oracle,PostgreSQL,Mong ...
- 多光源渲染方案 - Many Lights Sampling
目录 Importance Sampling(IS) Light BVH [2018~2019] 预构建 BVH 重建 BVH 基于 BVH node 的 IS Real-time Stochasti ...
- 介绍一个简易的MAUI安卓打包工具
介绍一个简易的MAUI安卓打包工具 它可以帮助进行MAUI安卓的打包. 虽然也是用MAUI写的,但是只考虑了Windows版本,mac还不太会. 没什么高级的功能,甚至很简陋,它能做的,只是节省你从M ...
- 20.1K Star!Notion的开源替代方案:AFFiNE
Notion这款笔记软件相信很多开发者都比较熟悉了,很多读者,包括我自己都用它来记录和管理自己的笔记.今天给大家推荐一个最近比较火的开源替代方案:AFFiNE.目前该开源项目已经斩获20.1K Sta ...
- Inpaint Anything:一键进行多种图像修补
本文分享自华为云社区<绘制一切>,作者: 雨落无痕 . 绘制一切-Inpaint Anything 相关链接: Notebook案例地址:绘制一切 AI Gallery:https://d ...
- 部署安装zookeeper集群
版本:3.7.0 节点IP: 172.50.13.103 172.50.13.104 172.50.13.105 获取安装包: wget http://mirrors.ustc.edu.cn/apac ...
- CentOS7系统初始化个人配置
以下内容为个人最小化安装后的配置步骤 更换yum源为阿里云 yum install -y epel-release lrzsz wget yum-axelget mv /etc/yum.repos.d ...
- MyBatis Mapper映射处理CLOB和BLOB类型
Mybatis的MapperXML映射文件应该处理数据库字段类型为CLOB和BLOB类型的数据呢?首先我们先看下CLOB和BLOB这两种数据类型的介绍. 介绍 使用Mybatis时涉及到两种特殊类型 ...
- .NET周刊【8月第2期 2023-08-14】
本周由于Myuki大佬感染新冠,国际板块暂停更新一周,将在下周补齐,所以本周只有国内板块. 国内文章 解决 Blazor 中因标签换行导致的行内元素空隙问题 https://www.cnblogs.c ...
- Programming abstractions in C阅读笔记: p118-p122
<Programming Abstractions In C>学习第49天,p118-p122,总结如下: 一.技术总结 1.随机数 (1)seed p119,"The init ...