Gson含抽象类的反序列化

场景描述:

反序列化A类的时候,这个类里面有一个抽象类属性B,B的实现类C里面又有一个抽象类属性D,D的实现类是E

实体类准备

public class A implements Serializable {
private B b; public A(B b) {
this.b = b;
} @Override
public String toString() {
return "A{" +
"b=" + b +
'}';
}
}
public abstract class B implements Serializable {
protected String name; public B(){}
public B(String name) {
this.name = name;
} @Override
public String toString() {
return "B{" +
"name='" + name + '\'' +
'}';
}
}
public class C extends B{
private D d; public C(String name) {
super(name);
}
public C(String name,D d) {
super(name);
this.d = d;
} @Override
public String toString() {
return "C{" +
"d=" + d +
'}';
}
}
public abstract class D implements Serializable {
protected String name; public D(){}
public D(String name) {
this.name = name;
} @Override
public String toString() {
return "D{" +
"name='" + name + '\'' +
'}';
}
}
public class E extends D{
public E() {
super("this is E");
} public E(String name, String name1) {
super(name);
this.name = name1;
} @Override
public String toString() {
return "E{" +
"name='" + name + '\'' +
'}';
}
}

反序列化适配器

public class Adapter<T> implements JsonDeserializer<T> {
private T obj; @SuppressWarnings("unchecked")
public Adapter(Class<?> clz) {
this.obj = (T) clz;
} @Override
public T deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
try {
return OK.GsonFactory.gson.fromJson(jsonElement, (Type) Class.forName(((Class) obj).getName()));
} catch (ClassNotFoundException e) {
throw new JsonParseException(e);
}
}
}

反序列化

public class OK {
public static void main(String[] args) {
E e = new E("this is e","this e is filed");
C c = new C("this is c", e);
final A a = new A(c); final A a1 = GsonFactory.gson.fromJson(new Gson().toJson(a), A.class); System.out.println(a); // A{b=C{d=E{name='this e is filed'}}}
System.out.println(a1); // A{b=C{d=E{name='this e is filed'}}}
} public static class GsonFactory {
public static Gson gson;
static {
gson = new GsonBuilder()
// 指定对应抽象类的具体处理类型
.registerTypeAdapter(B.class,new Adapter<C>(C.class))
.registerTypeAdapter(D.class,new Adapter<E>(E.class))
.create();
}
}
}

Gson含抽象类的反序列化的更多相关文章

  1. Gson的序列化和反序列化-待更新

    反序列化为List List<Person> persons =gson.fromJson(json, new TypeToken<List<Person>>() ...

  2. 完全理解Gson(3):Gson反序列化

    完全理解Gson(2):Gson序列化 完全理解Gson(1):简单入门 本文延续前一篇文章,继续介绍简单基本的Gson用法.这篇文章我们将介绍如何将复杂的JSON对象解析为Java对象,其中Java ...

  3. json处理三部曲之第三曲:利用Gson处理json

    需要导入gson-xxx.jar包 <dependency> <groupId>com.google.code.gson</groupId> <artifac ...

  4. Gson 使用总结 高级用法

    Gson基本用法 参考:http://www.jianshu.com/p/e740196225a4 Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列 ...

  5. 【转】采用Gson解析含有多种JsonObject的复杂json

    本文对应的项目是MultiTypeJsonParser ,项目地址 https://github.com/sososeen09/MultiTypeJsonParser 0 前奏 使用 Gson 去解析 ...

  6. Gson格式转换Integer变为Double类型问题解决

    问题描述 在前后端分离的开发模式下,前后端交互通常采用JSON格式数据.自然会涉及到json字符串与JAVA对象之间的转换.实现json字符串与Java对象相互转换的工具很多,常用的有Json.Gso ...

  7. 废弃fastjson!大型项目迁移Gson保姆级攻略

    前言 大家好,又双叒叕见面了,我是天天放大家鸽子的蛮三刀. 在被大家取关之前,我立下一个"远大的理想",一定要在这周更新文章.现在看来,flag有用了... 本篇文章是我这一个多月 ...

  8. Gson的使用

    GSON:是Google开发的Java API,用于转换Java对象和Json对象 <dependency> <groupId>com.google.code.gson< ...

  9. [转]Json转换神器之Google Gson的使用

    这几天,因为项目的需要,接触了Google的Gson库,发现这个东西很好用,遂记下简单的笔记,供以后参考.至于Gson是干什么的,有什么优点,请各位同学自行百度.话不多说,切入正题: 1. 下载Gso ...

随机推荐

  1. 哈希表查找(散列表查找) c++实现HashMap

    算法思想: 哈希表 什么是哈希表 在前面讨论的各种结构(线性表.树等)中,记录在结构中的相对位置是随机的,和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较.这一类 ...

  2. eclispe: 修改所有文件默认编码为UTF-8

    1.修改 workspace text file encoding 依次点击windows -> Preferences -> general -> Workspace,修改如图的编 ...

  3. java8在Stream的forEach操作时获取index

      import java.util.Objects; import java.util.function.BiConsumer; /** * * @author yangzhilong * @dat ...

  4. Error:A problem occurred configuring project ':networklibrary'. > No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android

    https://blog.csdn.net/dafeige8/article/details/87880998 https://blog.csdn.net/vocanicy/article/detai ...

  5. springMVC 数据模型相关注解 可注释类型 ModelAttribute SessionAttributes InitBinder

    ModelAttribute 参数/方法SessionAttributes 类InitBinder 方法

  6. git冲突处理-Please move or remove them before you can merge

    参考:https://www.cnblogs.com/wenlj/p/5866356.html https://my.oschina.net/lixiaoyan/blog/1821947 #### 将 ...

  7. centos7.5系统elasticsearch使用滚动和全新安装升级到最新的elasticsearch7.4.2版本

    背景: 生产环境大量使用 elasticsearch 集群,不同的业务使用不同版本的elasticsearch es经常曝出一些大的漏洞,需要进行版本升级,并且使用x-pack的基本验证功能,避免用户 ...

  8. Java学习-058-Jsoup爬虫获取中国所有的三级行政区划数据(三),处理二级编码缺失

    通过查看数据可知,直辖市或者某些三级行政区域没有对应的二级区域,为方便后续的地址使用,可自定义缺失的二级地址. 如下示例自定义的二级行政区域的名称为一级区域的名称,对应的源码如下所示: 将此段源码添加 ...

  9. win10 搜索栏输入后长期没反应

    博客转载自:https://blog.csdn.net/qq_40875146/article/details/81742533 Get-AppXPackage -Name Microsoft.Win ...

  10. 测试面试题集锦----liunx与网络

    国庆完后就回深圳了,所以也要参加面试了,我大概收集了一些感觉可能会面试到的一些笔试题,给大家参考,答案不一定全对,分为liunx ,网络,mysql,编程题,我分别按分类补充,以后在继续补充 liun ...