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

