将json字符串转换为对象列表的通用方法

我想创建将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
    }

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

oo748899 回答:将json字符串转换为对象列表的通用方法

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

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

(您可能会注意到我使用emptyArray<T>而不是Array<T>::class.java来获取类型。这可能是kotlin中的错误,因为后者会给您Object[]而不是Array<T>

(它在这里看起来不错,但对于复杂的情况却不足够,因为我们将其制作为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) }
}

(当然,您可以使用clazz再次省略reified参数)

本文链接:https://www.f2er.com/3147222.html

大家都在问