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
相关产品推荐
相关产品推荐

