Kotlin命令行项目调用CoinbaseAPI遇JSON解析错误求助
解决Coinbase API调用时的JsonDecodingException问题
错误核心原因
你遇到的问题本质是JSON解析模型与API返回结构不匹配,或者在处理用户输入时错误地将字符串类型的货币代码(如USD)强制转换为Double类型,导致解析器尝试把"USD"转成数字失败,抛出JsonDecodingException。
分步解决方案
1. 修正用户输入处理逻辑
检查读取用户输入的代码,确保没有把输入的字符串转成Double:
// 错误写法:会把字符串USD强制转成Double,直接报错 // val currencyCode = readLine()?.toDouble() // 正确写法:保留字符串类型 val currencyCode = readLine()?.trim() ?: ""
2. 匹配Coinbase API结构定义数据类
Coinbase公开汇率API(如https://api.coinbase.com/v2/exchange-rates?currency=USD)的返回结构如下:
{ "data": { "currency": "USD", "rates": { "BTC": "0.000023", "EUR": "0.92" } } }
你需要定义完全匹配的Kotlin数据类,避免把currency这类字符串字段定义成Double:
// 若使用kotlinx.serialization,需添加@Serializable注解 import kotlinx.serialization.Serializable @Serializable data class ExchangeRateResponse( val data: ExchangeRateData ) @Serializable data class ExchangeRateData( val currency: String, // 这里必须是String类型,不能是Double val rates: Map<String, String> // rates值为字符串,后续可按需转成Double )
3. 修正JSON解析逻辑
确保解析时使用正确的数据类:
import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json // 假设apiResponseString是接口返回的JSON字符串 val response = Json.decodeFromString<ExchangeRateResponse>(apiResponseString) // 如需使用汇率数值,再单独转换 val btcRate = response.data.rates["BTC"]?.toDouble()
关键验证点
查看错误堆栈中指向的具体字段,确认是哪个属性被错误定义为Double,将其修改为String类型即可解决问题。
内容的提问来源于stack exchange,提问作者mdaw11
相关产品推荐
相关产品推荐

