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

Kotlin中如何将含百余币种对象的复杂JSON转换为Currency数据类?

币种JSON转Kotlin数据模型解决方案

你不需要为100多个币种单独写类,原本用Map<String, Currency>的思路是完全正确的,解析失败大概率是序列化配置、请求参数错误导致的,按以下步骤排查即可:

1. 先确认请求参数是否匹配后端要求

你当前的接口参数注解存在疑似错位问题,请优先核对:

@GET(ApiEndPoints.GET_CURRENCIES)
suspend fun getCurrencies(
    // 请确认Constants.API_KEY这个请求参数名,对应的值是不是你要传的apikey
    @Query(Constants.API_KEY)
    countryCode: String = ApiEndPoints.API_KEY,
    // 请确认Constants.FROM_TO这个请求参数名,对应的值是不是汇率转换对
    @Query(Constants.FROM_TO)
    apiKey:String = "USD_USD",
    @Query("compact")
    compact:String = "ultra"
):CurrencyResults

参数传错会导致后端返回错误结构的响应,自然无法解析为预期的数据模型。

2. 确认序列化库配置正确

如果你使用Gson作为解析库

  • 确保build.gradle中添加了Gson转换器依赖
  • 确保Retrofit实例初始化时添加了Gson转换器:
val retrofit = Retrofit.Builder()
    .baseUrl(BASE_URL)
    // 必须添加这行
    .addConverterFactory(GsonConverterFactory.create())
    .build()
  • 保险起见可以给数据类添加序列化注解,同时防止混淆导致字段名被篡改:
data class CurrencyResults(
    @SerializedName("results")
    val results: Map<String, Currency>
)

data class Currency(
    @SerializedName("currencyName")
    val currencyName: String,
    @SerializedName("currencySymbol")
    val currencySymbol: String,
    @SerializedName("id")
    val id: String,
)
  • 如果开启了混淆,给两个数据类添加@Keep注解,防止被混淆工具裁剪。

如果你使用kotlinx.serialization作为解析库

  • 给所有数据类添加@Serializable注解:
@Serializable
data class CurrencyResults(
    val results: Map<String, Currency>
)

@Serializable
data class Currency(
    val currencyName: String,
    val currencySymbol: String,
    val id: String,
)
  • 确保Retrofit添加了对应的转换器工厂。

3. ViewModel调用逻辑补充

添加异常捕获方便定位问题:

init {
    viewModelScope.launch {
        runCatching {
            // 替换为你实际初始化的Api接口实例
            apiInstance.getCurrencies()
        }.onSuccess { result ->
            // 所有币种数据都存在results的value中,直接取出即可
            val currencyList = result.results.values.toList()
            // 后续业务逻辑,比如更新UI状态
        }.onFailure { error ->
            // 打印错误日志,排查是请求失败还是解析失败
            error.printStackTrace()
        }
    }
}

如果某个币种可能存在字段缺失的情况,可以把Currency类的字段改为可空类型(比如val currencyName: String?),避免单个字段缺失导致全量解析失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:36:01