Как анализировать необработанный список json данных, размещенных в ktor

Я отправляю json-массив объектов. Я пытаюсь разобрать его в таком коде

val objs = call.receive<List<MyClass>>() // this work fine
val name objs[0].name // this throw exception LinkedTreeMap cannot be cast to MyClass

В приведенном выше коде вторая строка выдает исключение com.google.gson.internal.LinkedTreeMap cannot be cast to MyClass

Если я опубликую простой объект и проанализирую его в ktor с помощью call.receive<MyClass>(), тогда он будет работать нормально. Так что проблема возникает только при разборе списка объектов.


person William    schedule 23.04.2019    source источник


Ответы (2)


Вы можете сделать так

val json = call.receive<String>()
val objs = Gson().fromJson(json, Array<MyClass>::class.java)
objs[0].name

Обновлено

Вы также можете создать функцию расширения для этого, как это

suspend inline fun <reified T> ApplicationCall.safeReceive(): T {
    val json = this.receiveOrNull<String>()
    return Gson().fromJson(json, T::class.java)
}

затем используйте это так

val objs = call.safeReceive<Array<MyClass>>()
objs[0].name
person Sabeeh    schedule 23.04.2019
comment
Спасибо за быстрый ответ буду пробовать. Кажется, разбор вручную, если это возможно, не делая этого, было бы лучше, но это лучше, чем не работать. Еще раз спасибо - person William; 23.04.2019

Использование вашего кода с Array вместо List сработало для меня с использованием ktor v1.2.3:

val objs = call.receive<Array<MyClass>>() 
val name = objs[0].name


Примечание:

Позже я изменил свой класс данных на этот формат, чтобы упростить сопоставление строк базы данных с классом данных (т. е. использовать BeanPropertyRowMapper). Я не помню, чтобы это влияло на де/сериализацию, но если первая часть все еще не работает для вас, вы можете попробовать это...

data class MyClass(
    var id: Int? = null,
    var name: String? = null,
    var description: String? = null,
)

Ссылка: дополнительная переменная класса данных Kotlin

person cs_pupil    schedule 07.08.2019
comment
Это работало, но после обновления ktor до v1.2.3 с v1.1.3 больше не работает. - person findall; 15.08.2019