【问题标题】:How parse raw json list of data posted in ktor如何解析在 ktor 中发布的原始 json 数据列表
【发布时间】:2019-09-12 16:25:52
【问题描述】:

我正在发布 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&lt;MyClass&gt;() 在ktor 中解析它,那么它会正常工作。所以问题只是在解析对象列表时。

【问题讨论】:

    标签: kotlin ktor


    【解决方案1】:

    将您的代码与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 data class optional variable

    【讨论】:

    • 这一直有效,但在将 ktor 从 v1.1.3 更新到 v1.2.3 后不再有效..
    【解决方案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
    

    【讨论】:

    • 感谢您的快速回复,我会尝试的。如果可能的话,似乎手动解析而不这样做会更好,但总比不工作好。谢谢阿甘
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多