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

Android货币转换器API返回CurrencyResponse无法仅提取conversion_result问题

问题解决方法

你当前拿到异常格式返回值的核心原因是:Kotlin 数据类的默认toString()方法会输出「类名+所有属性键值对」的格式,你在代码中直接对CurrencyResponse对象调用了toString(),才会得到CurrencyResponse(conversion_result=1)这种结果。


修复步骤

1. 核心修改:调整ViewModel取值逻辑

修改CurrencyViewModel.kt中getConversionRate方法的赋值逻辑,不要调用整个对象的toString(),直接取conversion_result属性的值即可:

fun getConversionRate(baseCurrency: String, toCurrency: String, amount: Double?)  {
    viewModelScope.launch {
        val response = repository.getConversionRate(baseCurrency, toCurrency, amount)
        // 直接取属性值,不要调用toString()
        _conversionResult.value = response.conversion_result
    }
}

可选优化建议

1. 调整属性类型适配接口返回

接口返回的conversion_result是数值类型,你现在定义为String容易出现解析异常,建议修改CurrencyResponse.kt的属性类型为Double,Moshi会自动完成解析:

data class CurrencyResponse(
@Json(name="conversion_result") val conversion_result: Double 
)

修改后如果需要统一保留小数位展示,可以在ViewModel中格式化后再赋值:

_conversionResult.value = "%.2f".format(response.conversion_result)

2. 优化观察者注册逻辑

你当前把conversionResult的观察者放在了按钮点击事件中,每次点击都会重复注册同一个观察者,建议把观察者注册逻辑移到onViewCreated方法全局只注册一次:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // ... 原有其他逻辑不变
    // 全局注册观察者,不要放在点击事件里
    viewModel.conversionResult.observe(viewLifecycleOwner) {
        binding.resultText.text = it
    }

    binding.button.setOnClickListener {
        val stringInTextField = binding.amountText.text.toString()
        val amount = stringInTextField.toDoubleOrNull()
        if(amount==null) {
            binding.resultText.text = " "
            // 加return避免空值发起无效请求
            return@setOnClickListener
        }
        viewModel.getConversionRate(firstCurrency, secondCurrency, amount)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:18:00