经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
gson如何序列化子类
来源:cnblogs  作者:随机的未知  时间:2023/10/20 8:45:26  对本文有异议

需求

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

举例

定义Person类、Student类、Worker类;

  1. @Data
  2. @ToString
  3. public class Person {
  4. //姓名
  5. private String name;
  6. //年龄
  7. private Integer age;
  8. //类型,0代表Student,1代表worker
  9. private Integer type;
  10. }
  11. @Data
  12. @ToString
  13. public class Student extends Person{
  14. //学校
  15. private String school;
  16. }
  17. @Data
  18. @ToString
  19. public class Worker extends Person{
  20. //薪水
  21. private Integer salary;
  22. }

字符串为:

  1. {
  2. "group":[
  3. {
  4. "school":"Hello中学",
  5. "name":"张三",
  6. "age":16,
  7. "type":0
  8. },
  9. {
  10. "salary":100000,
  11. "name":"李四",
  12. "age":35,
  13. "type":1
  14. }
  15. ]
  16. }

如果我们直接使用Gson来解析,解析代码如下:

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. Gson gson = new Gson();
  4. String jsonStr = "{\"group\":[{\"school\":\"Hello中学\",\"name\":\"张三\",\"age\":16,\"type\":0},{\"salary\":100000,\"name\":\"李四\",\"age\":35,\"type\":1}]}";
  5. Type type = new TypeToken<PersonGroup>() {
  6. }.getType();
  7. PersonGroup personGroup = gson.fromJson(jsonStr, type);
  8. //为了打断点
  9. System.out.println();
  10. }
  11. }

解析后的内容如下:

解析后的内容

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

解决方案

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

  1. public class PersonDesrializer implements JsonDeserializer<Person> {
  2. private Gson gson = new Gson();
  3. private Map<Integer, Class<? extends Person>> typeMap = new HashMap<>();
  4. public PersonDesrializer() {
  5. typeMap.put(0,Student.class);
  6. typeMap.put(1,Worker.class);
  7. }
  8. @Override
  9. public Person deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
  10. JsonObject jsonObject = jsonElement.getAsJsonObject();
  11. Class<? extends Person> typeClazz = this.typeMap.get(jsonObject.get("type").getAsInt());
  12. return gson.fromJson(jsonElement,typeClazz);
  13. }
  14. }

反序列化方式如下:

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. Gson gson = new GsonBuilder()
  4. .serializeNulls()
  5. .registerTypeAdapter(Person.class, new PersonDesrializer())
  6. .create();
  7. String jsonStr = "{\"group\":[{\"school\":\"Hello中学\",\"name\":\"张三\",\"age\":16,\"type\":0},{\"salary\":100000,\"name\":\"李四\",\"age\":35,\"type\":1}]}";
  8. Type type = new TypeToken<PersonGroup>() {
  9. }.getType();
  10. PersonGroup personGroup = gson.fromJson(jsonStr, type);
  11. //为了打断点
  12. System.out.println();
  13. }
  14. }

序列化结果

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

原文链接:https://www.cnblogs.com/nicaicai/p/17775515.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号