如何解析 ktor 中发布的原始 json 数据列表
How parse raw json list of data posted in ktor
我正在 posting 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
如果我 post 简单对象并在 ktor 中使用 call.receive<MyClass>()
解析它,那么它将正常工作。所以只有在解析对象列表时才会出现问题。
你可以这样做
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
使用你的代码 Array
而不是 List
使用 ktor v1.2.3 对我有用:
val objs = call.receive<Array<MyClass>>()
val name = objs[0].name
旁注:
我后来将我的数据 class 更改为这种格式,以帮助从数据库行映射到数据 class(即使用 BeanPropertyRowMapper)。我不记得这对 de/serialization 有影响,但如果第一部分仍然不适合你,你可以试试这个...
data class MyClass(
var id: Int? = null,
var name: String? = null,
var description: String? = null,
)
参考:
我正在 posting 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
如果我 post 简单对象并在 ktor 中使用 call.receive<MyClass>()
解析它,那么它将正常工作。所以只有在解析对象列表时才会出现问题。
你可以这样做
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
使用你的代码 Array
而不是 List
使用 ktor v1.2.3 对我有用:
val objs = call.receive<Array<MyClass>>()
val name = objs[0].name
旁注:
我后来将我的数据 class 更改为这种格式,以帮助从数据库行映射到数据 class(即使用 BeanPropertyRowMapper)。我不记得这对 de/serialization 有影响,但如果第一部分仍然不适合你,你可以试试这个...
data class MyClass(
var id: Int? = null,
var name: String? = null,
var description: String? = null,
)
参考: