Из-за типа стирания и специальных типов отражения массивов в jvm вы не можете сделать это действительно чисто, но есть способ использовать ключевое слово reified
в kotlin, в котором мы можем достичь этого:
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
)