一、前言
前段时间由于做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类型,所以需要手动取值
五、总结
以前碰到这些是相当的头疼,经常就需要转来转去的,网上的文章很多都没讲明白,虽然封装好的库,就这么几行代码,总之,方便开发才是最好的,这种繁琐的事越简单越好。