先抛出我所遇到的问题:对象中的一个属性对应多种数据结构如何反序列化?不同的type对应不同数据结构的data,如下图,
对于这样的场景我先说下两种不完美的解决方案:
方案一:统一用Object定义字段来接收数据,然后根据type再用json转成对应的对象。如下图,
虽然解决了问题,缺点也很明显,多次解析耗费CPU,而且很不优雅。作为程序员每次看到这样的代码,心中肯定有草泥马在奔腾。尤其是这样的代码是别人写的。这种方案不推荐使用。
方案二:数据结构拆分,就是让每个属性只对应一种数据结构。如下图,
这种方案比方案一的优势在于无需多余的解析,节省CPU资源。但也是有缺陷的,如果type类型很多,model中的字段也会变得很多。而且服务端新增类型就需要手动修改一次model。我们之前一值采用这种解决方案,但总感觉有更好的方案。所以也一直没有放弃探索。黄天不负有心人啊,终于在最近找到了非常优雅的解决方案。
主角登场,此处应该有掌声啊!他就是TypeAdapter,可以自定义model反序列化。那就让我们来看看,最终的解决方案,如下图,
先自定义一个JsonDeserializer反序列化的类,然后在deserialize方法中来实现我们自己的反序列化逻辑。这里我用的是Gson的注解方式@JsonAdapter来实现的。