Общий метод для преобразования строки JSON в список объектов - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу создать универсальный метод для преобразования строки 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
    }

Проблема в том, что я хочу получить тип класса из метода, а затем добавить к нему тип Array и снова получить classtype. Я не знаю, как справиться с этим.

1 Ответ

0 голосов
/ 07 ноября 2019

Из-за типа стирания и специальных типов отражения массивов в 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...