Gson解析封装

引入

 implementation 'com.google.code.gson:gson:2.8.6'

方法

//GsonKtx内方法
getGson     :获取gson
toJson      :任意对象转成json
toAny       :将json数据转成任意bean类
toMap       :将json数据转成Map
toList      :将json数据转成任意集合bean类
toList2     :将json数据转成任意集合bean类,遇到解析不了的,就使用这个
toListType  :将json数据转成任意集合bean类,需要自己定义好Type
toListMap   :将json数据转成任意集合Map类
//扩展方法
toJson      :任意对象转成json
toAny       :将json数据转成任意bean类
toMap       :将json数据转成Map
toList      :将json数据转成任意集合bean类
toList2     :将json数据转成任意集合bean类
toListType  :将json数据转成任意集合bean类,需要自定义Type
toListMap   :将json数据转成任意集合Map类

使用示例

  • 对象转json

    val testBean = TestBean(true, "alice")
    //工具类
    val json1 = GsonKtx.toJson(testBean)
    //扩展函数
    val json2 = testBean.toJson()
    
  • json转对象

    val jsonTest = "{\"isSuccess\":\"true\",\"name\":alice}"
    val test = GsonKtx.toAny<TestBean>(jsonTest)
    val test2 = jsonTest.toAny<TestBean>()
    
  • json转map

    val jsonTest = "{\"isSuccess\":\"true\",\"name\":alice}"
    val map = GsonKtx.toMap<Any>(jsonTest)
    
  • json转list

    • 方法一,自己定义好Type,调用toListType

      val jsonList = "[{\"isSuccess\":false,\"name\":\"a\"},{\"isSuccess\":true,\"name\":\"b\"}]"
      val typeToken: TypeToken<List<TestBean>> = object : TypeToken<List<TestBean>>() {}
      val list = jsonList.toListType<TestBean>(typeToken.type)
      list?.forEach {
          println(it.name)
      }
      
    • 方法二、调用toList

      val list22 = jsonList.toList(Array<TestBean>::class.java)
      list22?.forEach {
          println(it.name)
      }
      
    • 方法三、调用toList2

      val list4 = GsonKtx.toList2<TestBean>(jsonList)
      println(list4)
      list4.forEach {
          println(it.name)
      }
      
  • json转listMap

    val list3 = GsonKtx.toListMap<String>(jsonList)
    println(list3)
    list3?.forEach {
        println(it?.get("name"))
    }
    

完整代码

/**
 * 任意对象转成json
 */
fun Any?.toJson() = GsonKtx.toJson(this)
fun Any?.toJson(gson: Gson) = GsonKtx.toJson(gson, this)

/**
 *将json数据转成任意bean类
 */
inline fun <reified T> String?.toAny() = GsonKtx.toAny<T>(this)
fun <T> String?.toAny(clazz: Class<T>) = GsonKtx.toAny(this, clazz)
fun <T> String?.toAny(gson: Gson, clazz: Class<T>) = GsonKtx.toAny(gson, this, clazz)

/**
 *将json数据转成Map
 */
inline fun <reified T> String?.toMap() = GsonKtx.toMap<T>(this)
fun <T> String?.toMap(clz: Class<T>?) = GsonKtx.toMap(this, clz)

/**
 *将json数据转成任意集合bean类
 */
fun <T> String?.toList(clz: Class<Array<T>>?) = GsonKtx.toList(this, clz)
fun <T> String?.toList(gson: Gson, clz: Class<Array<T>>?) = GsonKtx.toList(gson, this, clz)

/**
 *将json数据转成任意集合bean类
 */
inline fun <reified T> String?.toList2() = GsonKtx.toList2<T>(this)
fun <T> String?.toList2(clz: Class<T>?) = GsonKtx.toList2(this, clz)

/**
 *将json数据转成任意集合bean类,需要自定义Type
 */
fun <T> String?.toListType(type: Type) = GsonKtx.toListType<T>(this, type)

/**
 *将json数据转成任意集合Map类
 */
inline fun <reified T> String?.toListMap() = GsonKtx.toListMap<T>(this)
fun <T> String?.toListMap(clazz: Class<T>) = GsonKtx.toListMap(this, clazz)


object GsonKtx {

    private val gson = Gson()

    /**
     *获取 gson
     */
    fun getGson() = gson

    /**
     * 任意对象转成json
     */
    fun toJson(any: Any?): String? {
        return toJson(gson, any)
    }

    fun toJson(gson: Gson, any: Any?): String? {
        return try {
            gson.toJson(any)
        } catch (e: Exception) {
            null
        }
    }

    /**
     *将json数据转成任意bean类
     */
    inline fun <reified T> toAny(json: String?): T? {
        return toAny(json, T::class.java)
    }

    fun <T> toAny(json: String?, clazz: Class<T>): T? {
        return toAny(gson, json, clazz)
    }

    fun <T> toAny(gson: Gson, json: String?, clazz: Class<T>): T? {
        return try {
            gson.fromJson(json, clazz)
        } catch (e: Exception) {
            null
        }
    }

    /**
     *将json数据转成任意集合bean类
     */
    fun <T> toList(json: String?, clz: Class<Array<T>>?): List<T>? {
        return toList(gson, json, clz)
    }

    fun <T> toList(gson: Gson, json: String?, clz: Class<Array<T>>?): List<T>? {
        return try {
            val ts: Array<T> = gson.fromJson(json, clz)
            mutableListOf(*ts)
        } catch (e: Exception) {
            null
        }
    }

    /**
     *将json数据转成任意集合bean类,需要自己定义好Type
     *   val typeToken: TypeToken<List<TestBean>> = object : TypeToken<List<TestBean>>() {}
     */
    fun <T> toListType(json: String?, type: Type): List<T>? {
        return toListType(gson, json, type)
    }

    fun <T> toListType(gson: Gson, json: String?, type: Type): List<T>? {
        return try {
            gson.fromJson(json, type)
        } catch (e: Exception) {
            null
        }
    }

    /**
     * Json转List集合,遇到解析不了的,就使用这个
     */
    inline fun <reified T> toList2(json: String?): List<T> {
        return toList2(json, T::class.java)
    }

    fun <T> toList2(json: String?, cls: Class<T>?): List<T> {
        val mList: MutableList<T> = ArrayList()
        try {
            val array = JsonParser().parse(json).asJsonArray
            for (elem in array) {
                mList.add(gson.fromJson(elem, cls))
            }
        } catch (e: Exception) {
        }
        return mList
    }

    /**
     * Json转换成Map的List集合对象
     */
    inline fun <reified T> toListMap(json: String?): List<Map<String?, T>?>? {
        return toListMap(json, T::class.java)
    }

    fun <T> toListMap(json: String?, clz: Class<T>?): List<Map<String?, T>?>? {
        return toListMap(gson, json, clz)
    }

    fun <T> toListMap(gson: Gson, json: String?, clz: Class<T>?): List<Map<String?, T>?>? {
        return try {
            val type: Type = object : TypeToken<List<Map<String?, T>?>?>() {}.type
            gson.fromJson(json, type)
        } catch (e: Exception) {
            null
        }
    }

    /**
     * Json转Map对象
     */
    inline fun <reified T> toMap(json: String?): Map<String?, T>? {
        return toMap(json, T::class.java)
    }

    fun <T> toMap(json: String?, clz: Class<T>?): Map<String?, T>? {
        return toMap(gson, json, clz)
    }

    fun <T> toMap(gson: Gson, json: String?, clazz: Class<T>?): Map<String?, T>? {
        return try {
            val type = object : TypeToken<Map<String?, T>?>() {}.type
            return gson.fromJson(json, type)
        } catch (e: Exception) {
            null
        }
    }


}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容