【问题标题】:Serialize custom object list in a Response with kotlinx使用 kotlinx 序列化响应中的自定义对象列表
【发布时间】:2021-08-22 23:36:12
【问题描述】:

我有下一个 json 作为响应:

 {"id":1581,"title":"hhhh","tags":[],"iconUrl":"images/b94cdcde-9c6c-4ea1-9c22-47b4c1750cce","valoration":0,"postList":[{"id":41,"x":0.58,"y":0.3,"rotation":338,"resourceUrl":"images/ba4202c2-845f-4b70-8167-5ef4ffb347bf","valoration":0}]}

我已经在我的项目中声明了响应:

@Serializable
data class BoardResponse(
    @SerialName("id")
    val id: Int,
    @SerialName("title")
    val title: String,
    @SerialName("tags")
    val tags: List<String>,
    @SerialName("iconUrl")
    val iconUrl: String,
    @SerialName("valoration")
    val valoration: Float,
    @SerialName("postList")
    val posts: List<PostResponse>
)

问题是我在“posts”值中总是得到一个空值。

这是回复:

@Serializable
data class PostResponse(
    @SerialName("id")
    val id: Int,
    @SerialName("x")
    val x: Float,
    @SerialName("y")
    val y: Float,
    @SerialName("rotation")
    val rotation: Int,
    @SerialName("resourceUrl")
    val resourceUrl: String,
    @SerialName("valoration")
    val valoration: Float
)

我能以某种方式做我想做的事吗?

【问题讨论】:

    标签: android json api kotlin serialization


    【解决方案1】:

    您的代码是正确的。使用与您完全相同的声明,并使用您提供的示例 JSON,以下测试通过(您得到非空 posts):

    @Test
    fun test() {
        val json = """{"id":1581,"title":"hhhh","tags":[],"iconUrl":"images/b94cdcde-9c6c-4ea1-9c22-47b4c1750cce","valoration":0,"postList":[{"id":41,"x":0.58,"y":0.3,"rotation":338,"resourceUrl":"images/ba4202c2-845f-4b70-8167-5ef4ffb347bf","valoration":0}]}"""
        val resp = Json.decodeFromString<BoardResponse>(json)
        assertEquals(1, resp.posts.size)
    }
    

    我认为您将 Kotlinx 序列化设置为反序列化库的方式一定有问题。请更新您的问题,详细说明您如何使用该库来反序列化此 JSON,或提出另一个问题。

    【讨论】:

    • 我将 kotlin 版本降级为“1.4.32”,它解决了问题,是的,这可能是库的问题。
    • 以上测试通过 Kotlin 1.5.10 和 Kotlinx 序列化 1.2.0
    【解决方案2】:

    数据类 PostResponse( 有效 ID:整数, val x:浮点数, val y:浮点数, val 旋转:Int, val resourceUrl:字符串, val 估值:浮动 ) : 可序列化

    注意:所有变量名称必须与您的响应参数(键)相同

    【讨论】:

    • 这是OP在他自己的答案中所说的(无需重新发布),实际上也仍然不正确。使用 @SerialName 可以将 Kotlin 属性名称与其 JSON 名称以序列化形式分离。
    【解决方案3】:

    算了,唯一的问题是 val 的名称:

    val 帖子:列表

    只需将其更改为 postList 即可。不知道 val 名称可以链接到 json 名称。

    【讨论】:

    • @SerialName 注释应该会覆盖此行为。你确定那是问题吗?可能是您没有使用 Kotlinx 序列化库来反序列化该 JSON,但您可能在不知情的情况下在幕后使用了其他东西(例如 Jackson)。
    • 是的,对不起,当我回答这个问题时,我一定很困惑!我今天早上检查,我也将kotlin版本降级为“1.4.32”。但我不明白为什么“1.5.x”版本不起作用
    猜你喜欢
    • 2020-02-15
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多