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

如何在Android Jetpack Compose中为API响应创建适配的数据类?

数据类适配API响应的解决方案

原始API响应结构

{
    "result": [
        {
            "key": "facility",
            "data": {
                "food": {
                    "nm": "Food"
                },
                "ppeKit": {
                    "nm": "PPE kit"
                },
                "transport": {
                    "nm": "Transport"
                }
            }
        }
    ]
}

原错误数据类定义

data class ResultItem(
    val key: String,
    val data: String
)

需求说明

需要将data部分存储为键值对:以food、ppeKit等为key,对应的nm字段值(如Food、PPE kit等)为value;data的键值对数量不固定,可多可空,且能根据选中的value快速找到对应key。


解决方案

方案一:直接用Map<String, String>存储data

data class ResultItem(
    val key: String,
    val data: Map<String, String>
)

方案二:嵌套数据类+转换方法(兼容原始结构解析)

如果需要保留原始API嵌套结构的解析能力,可先定义对应子结构的数据类,再通过转换方法得到目标键值对:

// 对应原始data中子对象的数据类
data class FacilityItem(val nm: String)

data class ResultItem(
    val key: String,
    val data: Map<String, FacilityItem>
)

// 转换为业务需要的键值对Map
fun ResultItem.toDataMap(): Map<String, String> {
    return data.mapValues { it.value.nm }
}

方案三:双向映射(快速反向查找key)

如果需要频繁根据选中的nm值反向查找对应key,可额外维护一个懒加载的反向映射:

data class ResultItem(
    val key: String,
    val data: Map<String, String>
) {
    // 懒加载反向映射,仅在需要时初始化
    val reverseDataMap by lazy {
        data.entries.associateBy({ it.value }, { it.key })
    }
}

方案说明

  1. 方案一最简洁,Kotlin的Map天然支持动态数量的键值对,空场景也能兼容(空Map)。如果你的序列化库(如Gson、Moshi)支持直接将JSON对象解析为Map<String, String>,这是最优选择。
  2. 方案二适合需要保留原始API结构的场景,先解析完整嵌套对象,再转换为业务所需的键值对,兼顾了原始数据完整性和业务需求。
  3. 方案三在方案一基础上增加了反向映射,通过lazy初始化避免不必要的性能消耗,能快速根据选中的nm值找到对应的原始key(比如用户选了"Food",可立刻拿到"food"),完美匹配“根据选中数据快速找对应key”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:43:17