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

Android Retrofit响应:将Result对象转为Map<String, String>的方案咨询

动态货币列表转Map<String, String>的解决方案

核心思路

不用维护包含170+货币字段的固定数据类,直接利用Gson的自动解析能力,将API返回的results字段直接映射为Map<String, String>,彻底避免货币列表变更时修改代码的麻烦。

方案一:修改数据类直接接收Map

这是最简洁高效的方案,直接调整你的Result数据类,将原有的货币列表类替换为Map<String, String>:

// 替换原来的Result类
data class Result(
    val success: Boolean,
    // 直接用Map接收所有货币键值对
    val results: Map<String, String>
)

之后你的Retrofit接口就可以直接返回Call<Result>(或协程风格的suspend fun getCurrencies(): Result),Gson会自动把API返回的results对象里的所有货币解析成Map,不管新增或减少货币类型,都无需修改数据类。

方案二:将已有的Result对象转换为Map

如果已经存在包含固定货币字段的Result类,临时需要将其转换为Map,可以借助Gson的序列化/反序列化能力实现:

import com.google.gson.Gson
import com.google.gson.reflect.TypeToken

// 假设你的原有Result类结构如下
data class OldResult(
    val success: Boolean,
    val results: OldCurrencyResults
)

data class OldCurrencyResults(
    val USD: String,
    val EUR: String,
    // ... 其他170+货币字段
)

// 转换方法
fun convertToCurrencyMap(oldResult: OldResult): Map<String, String> {
    val gson = Gson()
    // 先序列化货币对象为JSON树,再反序列化为Map
    val jsonTree = gson.toJsonTree(oldResult.results)
    return gson.fromJson(jsonTree, object : TypeToken<Map<String, String>>() {}.type)
}

适配你的Retrofit配置

你的现有Retrofit配置已经使用了GsonConverterFactory,完全支持上述两种方案,无需额外修改Retrofit或OkHttpClient的配置代码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:18:50