如何解析发布在ktor中的原始json数据列表

时间:2019-04-23 13:08:10

标签: kotlin 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

如果我发布简单对象并使用call.receive<MyClass>()在ktor中对其进行解析,则它将正常工作。因此,问题仅在解析对象列表时出现。

2 个答案:

答案 0 :(得分:1)

您可以这样做

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

答案 1 :(得分:1)

在ktor v1.2.3中,将您的代码与Array而非List一起使用对我来说很有效:

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 data class optional variable