当前位置:网站首页>Json和对象之间转换的封装(Gson)
Json和对象之间转换的封装(Gson)
2022-07-31 11:55:00 【wresource】
一、前言
前段时间由于做spring boot的后端,经常需要进行Json 和对象之间的转换,所以利用Gson结合Kotlin扩展函数的特性封装了两个非常方便的函数,如果是其他语言,也可以封装一下,就是没Kotlin方便了。下面展示一下最终封装效果
对象转Json
val cat = Cat()
cat.toMyJson()
Json转对象
//单个对象,这里转换成单个对象需要手动,主要是为例统一形式
val cat = Cat()
val data = cat.toMyJson()
data.toMyObject<Cat>()[0]
//list 类型
val cats = List<Cat>()
val dataList = cats.toMyObject<Cat>()[0]
二、对象转 Json
这里的需要在Any下面进行扩展,由于Any为所有类的父类,这个和Java里面的Object 有点类似
fun Any.toMyJson():String{
return Gson().toJson(this)
}
封装好了就可以直接用了,这个处理起来Gson也没有那么难,但只用写点的方式,节省了打括号的时间
val cat = Cat()
cat.toMyJson()
三、Json 转对象
这个起初封装的时候还有点问题,首先扩展对象比较容易找到,就是String类型,但有一点需要进行注意的,这里Gson转化用到了反射机制,所以需要做两个处理
- 进行泛型实化处理
- 处理反射相关的问题
最终代码效果
inline fun <reified T> String.toMyObject(): List<T> {
val listType: Type = `$Gson$Types`.newParameterizedTypeWithOwner(null, ArrayList::class.java, T::class.java)
return if(!contains("[")){
Gson().fromJson("[${this}]", listType)
}else{
Gson().fromJson(this, listType)
}
}
封装的使用
val cat = Cat()
val data = cat.toMyJson()
data.toMyObject<Cat>()[0]
不过这里有个缺点就是如果是单个对象的话,需要手动取第一个值作为对象,因为返回值是list类型的,如果有大佬有换返回值类型的方法,欢迎评论区留言
四、需要注意的问题
对象转Json需要注意的
这个只需要注意转换之后的格式即可,list或者单个对象都是可以直接转换的
Json 转对象需要注意的
这个需要注意的就是对象是什么类型的要清楚,还有就是非Json格式的字符串是不能转换成功的,虽然它有这个方法,然后目前我这套方案是转化成统一的list类型,所以需要手动取值
五、总结
以前碰到这些是相当的头疼,经常就需要转来转去的,网上的文章很多都没讲明白,虽然封装好的库,就这么几行代码,总之,方便开发才是最好的,这种繁琐的事越简单越好。
边栏推荐
- Cloudera Manager —— 端到端的企业数据中心管理工具
- MySQL index usage and optimization
- Use jOOQ to write vendor-agnostic SQL with JPA's native query or @Formula.
- 蓝牙协议栈开发板 STM32F1 跑蓝牙协议栈 –传统蓝牙搜索演示以及实现原理[通俗易懂]
- “带薪划水”偷刷阿里老哥的面经宝典,三次挑战字节,终成正果
- MySQL面试八股文(2022最新整理)
- Distributed id solution
- lotus-local-net 2k v1.17.0-rc4
- Threading(in thread main)
- chroot命令
猜你喜欢
订song餐系统
file contains vulnerabilities
The most complete phpmyadmin vulnerability summary
“带薪划水”偷刷阿里老哥的面经宝典,三次挑战字节,终成正果
台达PLC出现通信错误或通信超时或下载时提示机种不符的解决办法总结
Acwing第 62 场周赛【未完结】
5 open source Rust web development frameworks, which one do you choose?
AWS亚马逊云账号注册,免费申请12个月亚马逊云服务器详细教程
mysql根据多字段分组——group by带两个或多个参数
JVS设置不同应用的登录时效时间
随机推荐
MySQL 行级锁(行锁、临键锁、间隙锁)
分布式id解决方案
mysql 自动添加创建时间、更新时间
分布式事务Seata详细使用教程
分布式事务——分布式事务简介、分布式事务框架 Seata(AT模式、Tcc模式、Tcc Vs AT)、分布式事务—MQ
MySQL 的几种碎片整理方案总结(解决delete大量数据后空间不释放的问题)
Initial JDBC programming
502 bad gateway causes and solutions
“带薪划水”偷刷阿里老哥的面经宝典,三次挑战字节,终成正果
【虚拟化生态平台】树莓派安装虚拟化平台操作流程
R 语言data.frame 中的另一行中减去一行
5 open source Rust web development frameworks, which one do you choose?
Android studio连接MySQL并完成简单的登录注册功能
Obsidian设置图床
Candence学习篇(11) allegro中设置规则,布局,走线,铺铜
第十二章 使用中的 OpenAPI 属性
mysql 索引使用与优化
Power BI----几个常用的分析方法和相适应的视觉对象
瑞吉外卖项目:新增菜品与菜品分页查询
Docker实践经验:Docker 上部署 mysql8 主从复制