IT七剑客 IT七剑客
首页
wresource
郭霖
孤寒者
IT邦德
沉默王二
老麦
stackoverflow
GitHub (opens new window)
首页
wresource
郭霖
孤寒者
IT邦德
沉默王二
老麦
stackoverflow
GitHub (opens new window)
  • 基础安卓文章

  • 服务器开发

    • CDN+COS搭建图床超详细步骤
    • 搭建情人节表白网站(超详细过程,包教包会)
    • 云原生数据库VS传统数据库
    • Amazon S3对象储存(以图片为例)
    • 宝塔node项目的部署(https)
    • mybatis-plus入门使用
    • Json和对象之间转换的封装(Gson)
      • 一、前言
      • 二、对象转 Json
      • 三、Json 转对象
      • 四、需要注意的问题
        • 对象转Json需要注意的
        • Json 转对象需要注意的
      • 五、总结
    • 手把手教你从零开始腾讯云服务器部署
    • 快速学完数据库管理
    • 我的域名注册踩坑指南
    • 搭建和mybatis-plus官网一样主题的网站(cos+宝塔+vercel)
    • typecho去掉index.php
    • CDN的那些事
  • 数据结构

  • Kotlin基础

  • wresource 安卓
  • 服务器开发
wresource
2022-08-20
目录

Json和对象之间转换的封装(Gson)

# 一、前言

前段时间由于做spring boot的后端,经常需要进行Json 和对象之间的转换,所以利用Gson结合Kotlin扩展函数的特性封装了两个非常方便的函数,如果是其他语言,也可以封装一下,就是没Kotlin方便了。下面展示一下最终封装效果

对象转Json

val cat = Cat()
cat.toMyJson()
1
2

Json转对象

 //单个对象,这里转换成单个对象需要手动,主要是为例统一形式
val cat = Cat()
val data = cat.toMyJson()
data.toMyObject<Cat>()[0]

//list 类型
val cats = List<Cat>()
val dataList = cats.toMyObject<Cat>()[0]
1
2
3
4
5
6
7
8

# 二、对象转 Json

这里的需要在Any下面进行扩展,由于Any为所有类的父类,这个和Java里面的Object 有点类似

fun Any.toMyJson():String{
    return Gson().toJson(this)
}
1
2
3

封装好了就可以直接用了,这个处理起来Gson也没有那么难,但只用写点的方式,节省了打括号的时间

val cat = Cat()
cat.toMyJson()
1
2

# 三、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)
    }
}
1
2
3
4
5
6
7
8

封装的使用

val cat = Cat()
val data = cat.toMyJson()
data.toMyObject<Cat>()[0]
1
2
3

不过这里有个缺点就是如果是单个对象的话,需要手动取第一个值作为对象,因为返回值是list类型的,如果有大佬有换返回值类型的方法,欢迎评论区留言

# 四、需要注意的问题

# 对象转Json需要注意的

这个只需要注意转换之后的格式即可,list或者单个对象都是可以直接转换的

# Json 转对象需要注意的

这个需要注意的就是对象是什么类型的要清楚,还有就是非Json格式的字符串是不能转换成功的,虽然它有这个方法,然后目前我这套方案是转化成统一的list类型,所以需要手动取值

# 五、总结

以前碰到这些是相当的头疼,经常就需要转来转去的,网上的文章很多都没讲明白,虽然封装好的库,就这么几行代码,总之,方便开发才是最好的,这种繁琐的事越简单越好。

上次更新: 2023/04/05, 05:23:58
mybatis-plus入门使用
手把手教你从零开始腾讯云服务器部署

← mybatis-plus入门使用 手把手教你从零开始腾讯云服务器部署→

最近更新
01
How the creator of Angular is dehydrating the web (Ep 574)
06-07
02
For those who just don’t Git it (Ep 573)
06-07
03
Modern work requires attention. Constant alerts steal it
06-07
更多文章>
Theme by Vdoing | Copyright © 2022-2024 IT七剑客 | MIT License
  • 闽ICP备2021006579号-4
  • 闽公网安备 35012102500470号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式