【问题标题】:Generic method for convert json string to List of Objects将 json 字符串转换为对象列表的通用方法
【发布时间】:2019-11-07 05:53:08
【问题描述】:

我想创建将 json 字符串转换为对象列表的通用方法。

fun  convertJsonStringToObjectList(jsonString: String , clazz: Class<Any>) :List<Any>{
        val gson = Gson()
        val objectList = gson.fromJson(jsonString, Array<clazz>::class.java).asList()
        return objectList
}

此代码不起作用。我知道如何将 json 字符串转换为这样的类:

 fun <T> convertJsonStringToObject(jsonString: String, clazz: Class<T>): T {
        val gson = Gson()
        val objectList = gson.fromJson(jsonString, clazz)
        return objectList
    }

问题是我想从方法中获取类类型,然后将数组类型添加到它并再次获取类类型。我不知道如何处理。

【问题讨论】:

    标签: json class generics kotlin


    【解决方案1】:

    由于 jvm 中的类型擦除和数组的特殊反射类型,您不能真正干净地做到这一点,但有一种方法可以在 kotlin 中使用 reified 关键字:

    inline fun <reified T> convertJsonStringToObject(jsonString: String): Array<T> =
        Gson().fromJson(jsonString, emptyArray<T>().javaClass)
    

    (你可能注意到我使用emptyArray&lt;T&gt; 来获取类型而不是Array&lt;T&gt;::class.java。因为后者会给你一个Object[] 而不是Array&lt;T&gt;。这可能是kotlin 中的一个错误。)

    (这里可能看起来很合适,但对于复杂的情况还不够,因为我们已经做到了inline。)

    另外,这里有两种替代方法:

    将数组类型传递给函数(如java):

    fun <T> convertJsonStringToObject(
        jsonString: String, 
        clazz: Class<Array<T>>): Array<T> =
        Gson().fromJson(jsonString, clazz)
    
    //and call it like this:
    val result = convertJsonStringToObject(
        "[{\"test\":123}, {\"test\": 456}]", 
        Array<Test>::class.java)
    

    手动一一解析json数组:

    fun <T> convertJsonStringToObjectList(
        jsonString: String, 
        clazz: Class<T>): List<T> {
        val gson = Gson()
        val objects = gson.fromJson(jsonString, JsonElement::class.java).asJsonArray
        return objects.map { gson.fromJson(it, clazz) }
    }
    

    (同样,您可以使用 reified 省略 clazz 参数)

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 2021-08-01
      • 1970-01-01
      • 2011-12-28
      • 2014-04-07
      • 1970-01-01
      • 2013-06-25
      • 2021-04-14
      相关资源
      最近更新 更多