| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> gson反序列化成data class时的坑 -> 正文阅读 |
|
[移动开发]gson反序列化成data class时的坑 |
前言在Android开发中,gson是很常用的用来处理json的三方库,它是由Google维护的,一直以来都比较稳定,至少在使用Java开发时是这样的。 但是,gson对Kotlin的data class的支持就不是很完善了,会有一些坑,下面我们来看一看 gson反序列化成data class的正常情况在kotlin中我们使用data class来充当数据类,举个例子:
使用gson将json解析成对象也非常简单,如下
然后我们就得到一个User对象,数据也是ok的。之前也写过一些关于使用gson时的小技巧和封装,感兴趣的可以看一下: 属性值不能为null,结果反序列化后出现了null值还是上面的例子,data class如下
如果json数据中的name没有了,如下
解析出来的对象如下 然后在写代码时如果你稍微不注意,写了类似对name操作的代码,例如
运行
解决该问题的方式很简单,就是给name加个?就好了,我个人是很不喜欢用空安全这个问号的,写起来有点恶心了,每个地方都要加问号,虽然可以有效避免空指针异常,而且在一些业务场景下,某些字段是必须要有值的,本来就不能为null,如果为null说明数据是有异常的,在反序列化时直接抛异常就好了。 什么?data class默认值没有生效?有些场景下,我们希望数据有一些默认值,或者说我们为了解决上面那个null值的问题,想着给name一个默认值,期望如果json中没有name这个字段的话,就用name的默认值好了,如下:
然后再运行看一下
依旧报错 可以发现默认值并没有生效,仍然是null,打个断点你就知道原因是gson在找User的无参构造时没有找到,最终通过 那解决这个的问题也很简单,我们给每个属性都赋一个初始值,这样就会生成一个无参的构造函数了,也就不会出现这种问题了,来试一下
再次运行
恩,这样好像就ok了,这个也是我自己在日常开发中的方式,我习惯给每个属性一个默认值,写代码的时候好处理一些。
我们已经给data class所有属性默认值了,但是当json中某个属性的值显式的为null时,null值还是会覆盖到原本的默认值,这就又掉进第一个坑了,声明的时候不能为null,写代码的时候也没异常提示,结果运行就会出现NPE。 像这种返回数据不规范的情况还真没啥特别好的办法处理,唯一好处理的办法就是跟后端撕逼叫后端改…
好了,不装了,总结一下gson结合data class时可能产生的两个主要问题吧
其实针对上面的问题也有一些解决办法,自行查一下吧,但是不太喜欢,因为没有从根源解决问题。 要想从根源解决,很简单,不要用gson了,换moshi或者jackson就可以了,他们都针对kotlin做了单独的处理,具体用法官方文档也都有,这里就直接放出github地址了。 moshi:https://github.com/square/moshi Jackson:jackson-module-kotlin 如果你觉得本文对你有帮助,麻烦动动手指顶一下,可以帮助到更多的开发者,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客 ,谢谢! |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 20:46:07- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |