一文带你了解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序列化子类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Maven 继承父工程时的relativePath标签详细解析
这篇文章主要介绍了Maven 继承父工程时的relativePath标签解析,通过本文学习你需要注意子模块想要用父模块pom中的版本,请注意配置relativePath属性,需要的朋友可以参考下2022-12-12MyBatis-Plus中最简单的查询操作教程(Lambda)
这篇文章主要给大家介绍了关于MyBatis-Plus中最简单的查询操作的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2022-03-03spring+springmvc+mybatis 开发JAVA单体应用
这篇文章主要介绍了spring+springmvc+mybatis 开发JAVA单体应用的相关知识,本文通过图文实例代码的形式给大家介绍的非常详细 ,需要的朋友可以参考下2018-11-11spring data jpa如何使用自定义repository实现类
这篇文章主要介绍了spring data jpa如何使用自定义repository实现类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-11-11
最新评论