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

Wil*_*iam 5 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
Run Code Online (Sandbox Code Playgroud)

在上面的代码第二行抛出异常 com.google.gson.internal.LinkedTreeMap cannot be cast to MyClass

如果我发布简单的对象并在 ktor 中解析它, call.receive<MyClass>()那么它会正常工作。所以问题仅在解析对象列表时。

cs_*_*pil 6

使用您的代码而Array不是List使用 ktor v1.2.3 对我有用:

val objs = call.receive<Array<MyClass>>() 
val name = objs[0].name
Run Code Online (Sandbox Code Playgroud)


边注:

后来我将数据类更改为这种格式,以帮助从数据库行映射到数据类(即使用 BeanPropertyRowMapper)。我不记得这对反/序列化有影响,但如果第一部分仍然不适合你,你可以尝试这个......

data class MyClass(
    var id: Int? = null,
    var name: String? = null,
    var description: String? = null,
)
Run Code Online (Sandbox Code Playgroud)

参考:Kotlin数据类可选变量


Sab*_*eeh 2

你可以这样做

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

更新

您还可以为此创建扩展函数,如下所示

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

然后像这样使用它

val objs = call.safeReceive<Array<MyClass>>()
objs[0].name
Run Code Online (Sandbox Code Playgroud)