You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin新手无法正确构建目标Response对象结构求助

解决Kotlin中Response对象结构匹配问题

问题分析

你当前的ResponseObject把所有类别嵌套在category字段下,导致JSON结构多了一层不必要的嵌套,而目标结构里cat1、cat2是和id同级的顶级字段,所以需要调整data class的定义逻辑。

方案一:固定类别字段(适合类别数量固定的场景)

如果cat1、cat2是确定不会新增的固定类别,直接在data class中定义对应的顶级字段即可:

data class ResponseObject(
    val id: String,
    val cat1: Map<String, String>,
    val cat2: Map<String, String>
)

使用示例:

val response = ResponseObject(
    id = "abc123",
    cat1 = mapOf("key1" to "value1", "key2" to "value2"),
    cat2 = mapOf("key3" to "value3")
)

序列化后生成的JSON完全匹配目标结构:

{
  "id": "abc123",
  "cat1": {
    "key1": "value1",
    "key2": "value2"
  },
  "cat2": {
    "key3": "value3"
  }
}

方案二:动态类别字段(适合类别数量不固定的场景)

如果后续可能新增cat3、cat4这类动态类别,可以配合Jackson序列化库的注解实现动态平铺字段:

import com.fasterxml.jackson.annotation.JsonAnyGetter
import com.fasterxml.jackson.annotation.JsonIgnore

data class ResponseObject(
    val id: String,
    @JsonIgnore // 阻止此字段被直接序列化
    val categories: Map<String, Map<String, String>>
) {
    @JsonAnyGetter // 将Map中的键值对平铺为顶级字段
    fun getDynamicCategories() = categories
}

使用示例:

val categories = mapOf(
    "cat1" to mapOf("key1" to "value1", "key2" to "value2"),
    "cat2" to mapOf("key3" to "value3")
)
val response = ResponseObject(id = "abc123", categories = categories)

序列化后同样会生成目标结构的JSON,后续新增类别只需往categories中添加键值对即可,无需修改data class。

补充说明

如果你用的是Kotlinx Serialization而非Jackson,也可以通过自定义序列化器实现类似的动态平铺效果,核心逻辑都是把Map中的键值对作为顶级字段输出,避免额外的嵌套层级。

内容的提问来源于stack exchange,提问作者babycoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:55:02