写这篇文章的契机是因为我工作中遇到了这样一个问题,有一个抽象类XView,它的子类有两个具体类(事实上有更多),其中XRow的一个属性是List<XView>?。

目标:从json文件中将这个XRow反序列化出来

难点:List<XView>属性肯定不是老老实实的一个XView实例组成的一个list,抽象类没有实例的。这个属性是由XView的子类具体类们组成的,这个类型是不固定的,所以给反序列化增加了一些难度

解决办法:kotlinx.serialization https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md#open-polymorphism

abstract class XView {
}class XText : XView{val data: String?constructor(data: String?,) {this.data = data}
}class XRow : XView {var children: List<XView>?//省略一些属性constructor(children: List<XView>?) {this.children = children}
}

使用方法:

第一步:导入插件和包 https://github.com/Kotlin/kotlinx.serialization#android

第二步:添加@Serializable标签

@Serializable
abstract class XView {
}@Serializable
class XText : XView{val data: String?constructor(data: String?,) {this.data = data}
}@Serializable
class XRow : XView {var children: List<XView>?//省略一些属性constructor(children: List<XView>?) {this.children = children}
}

第三步:


object JsonUtil {private val module = SerializersModule {polymorphic(baseClass = XView::class) {subclass(XText::class)subclass(XRow::class)}}private val format: StringFormat = Json {coerceInputValues = trueserializersModule = moduleignoreUnknownKeys = trueclassDiscriminator = CLASS_DISCRIMINATORencodeDefaults = true}fun decode(jsonString: String): XView {return format.decodeFromString<XView>(jsonString)}const val CLASS_DISCRIMINATOR = "name"
}

解释一下format里面的设置:

coerceInputValues:设置为true,1.当json中的某一value是null,但是实体类中的这一属性类型并不是可空类型时;2.当json中的某一value是某个值,但实体类中的这一属性是某种枚举类,但这种枚举类不包括这个值时;这两种情况下,反序列化的这个属性值会被强行设置为默认值。默认是false,遇到以上两种情况会报错。

ignoreUnknownKeys:设置为true,当json中有些key在实体类中并没有对应的属性,就忽略掉它们。默认是false,遇到以上这种情况会报错。

encodeDefaults:这个是跟序列化相关的,设置是否序列化默认值

classDiscriminator:这个设置是反序列化抽象类的重点,默认为“type”。以上面的代码为例,我设置为“name”,反序列化的时候,首先是找json中的name所对应的value,如果value值是XRow,那么这个对象就会被反序列化为XRow类型,如果value值是XText,那么这个对象就会被反序列化为XText类型,如果value是别的没有的类型,就会报错。如果你name=XRow1的json对象解析为XRow,那加SerialName标签就完事儿了~

@SerialName("XRow1")
@Serializable
class XRow : XView {var children: List<XView>?//省略一些属性constructor(children: List<XView>?) {this.children = children}
}

kotlinx.serialization反序列化抽象类相关推荐

  1. 新一代Json解析库Moshi使用及原理解析

    概述 Moshi是Square公司在2015年6月开源的有关Json的反序列化及序列化的框架,说到Json,大家应该很快想到Gson,FastJson以及Jackson等著名的开源框架,那为什么还需要 ...

  2. 干货 | 携程机票 App KMM 跨端生产实践

    作者简介 禹昂,携程移动端资深工程师,Kotlin 中文社区核心成员,图书<Kotlin 编程实践>译者. Derek,携程资深研发经理,专注于移动端开发,热衷于各种跨端技术的研究和实践. ...

  3. Gson替代方案Moshi使用教程

    原文链接:新一代Json解析库Moshi使用及原理解析 推荐理由 硬伤:Gson无法解析设置Kotlin默认参数 全新JsonAdapter 解析效率高 报空异常(即是优点也是缺点) 概述 Moshi ...

  4. 快速入门KMM和Compose Multiplatform

    一.前言 最近才有空,想起来Compose-jb和kmm这2个框架,就来个快速入门指南吧. 什么是KMM (Kotlin Multiplatform Mobile) KMM用于简化跨平台开发,可以在A ...

  5. 为什么推荐 Java 开发人员都学习并使用 Kotlin?

    我使用 Java 已经有很长的时间了,工作中的使用有15年.如果算上在学校的时间的话,那就更长了.Java 的一个很大的优势是平台的开放性.这得益于 Java 字节代码和虚拟机的存在.由于 Java ...

  6. 更易于使用的Retrofit(不用写注解)

    前言 声明的时候比Retrofit更加简单,而且因为是从Retrofit上改的,所以Retrofit能用的东西这个库也能用 修改的地方 1.如果参数不加任何注解,则默认是@Field,并且value为 ...

  7. Kotlin 越来越牛逼了!学Java都我想转了!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 在过 ...

  8. Newtonsoft.Json使用

    一.NuGet包提交Newtonsoft.Json 二.引用命名空间 using Newtonsoft.Json; using Newtonsoft.Json.Linq; 三.命名空间 1.Newto ...

  9. proto的介绍和基础使用

    内容摘抄自书籍<Netty redis zookeeper高并发实战> Protobuf使用 proto文件来预先定义的消息格式.数据包是按照proto文件所定义的消息格式完成二进制码流的 ...

  10. Inspeckage,安卓动态分析工具

    From:安卓分析工具 Inspeckage 介绍:http://xdxd.love/2016/08/09/安卓分析辅助工具Inspeckage介绍/ PJ 微信数据库 并查询数据上传服务器:http ...

最新文章

  1. 2021高考成绩查询是几点,2021高考查分是从几点到几点
  2. SAP Spartacus B2B user列表对应的Angular Component
  3. 根据大小分割大文本_基于深度学习的图像分割在高德地图的实践
  4. 如何爬取了知乎用户信息,并做了简单的分析
  5. oracle先的lvm分配,LVM实战案例之LVM空间缩减(本次对PV,VG,LV等进行空间缩减)
  6. 用R和BioConductor进行基因芯片数据分析(三):计算median
  7. [渝粤教育] 长沙航空职业技术学院 信息技术 参考 资料
  8. 【Hadoop】用web查看hadoop运行状态
  9. 乘法口诀表 java_利用java 实现一个九九乘法口诀表
  10. vue省市区三级选择的实现
  11. 19款精品H5小游戏源码(2048 3d魔方 别踩白块 见缝插针) 200款普通h5小游戏源码 可直接上线
  12. 图论及其应用 2009年 期末考试答案 总结
  13. LayaBox微信小游戏截图功能 利用微信API实现完美截图
  14. Centos7 上安装 FastDFS
  15. “富勒”官网软件感染网银木马 360独家拦截 - 卫星杂谈 - 360官方论坛
  16. Numpy中的行向量和列向量
  17. houdini 摄像机使用
  18. 视频去水印工具推荐-视频去水印步骤
  19. 如何安装tushare
  20. 4.1-知识图谱在金融领域中的应用实践

热门文章

  1. 正版星界边境服务器,《星界边境(Starbound)》正式版联机教程
  2. Windows 10 驱动开发 及 驱动签名
  3. Win10禁用驱动签名,进入测试模式
  4. 重启服务器后docker wordpress “Error establishing a database connection”解决办法
  5. image.shape[] 和array.shape[]的含义
  6. 聚合支付服务商“利楚扫呗”完成5000万元A轮融资 富友集团领投
  7. 小米和美的互投,大明湖畔的董明珠怎么办?
  8. windows xp系统安装教程
  9. Android 非功能性测试(性能测试)
  10. Java中的package(包)