使用SwiftyJSON无法将JSON转为Double类型的问题求助
嘿,我来帮你搞定这个问题!
问题根源分析
你遇到的情况其实很常见——Cryptonator API返回的price字段在JSON里是字符串类型,而非原生的数字类型。虽然它看起来是0.47756685这样的小数,但实际返回的JSON结构里,这个值是被双引号包裹的(比如"0.47756685")。这就导致SwiftyJSON用.double去解析时找不到对应的数字类型,直接进入else分支;而用.string能正确读取到这个字符串格式的价格。
两种可行的解决方案
方案一:先取字符串再安全转Double(推荐)
这种方式更稳妥,能避免API返回异常格式时的崩溃,代码示例如下:
func updateCardanoData(json : JSON) { // 先获取字符串,再尝试转换成Double if let cardanoPriceString = json["ticker","price"].string, let cardanoResult = Double(cardanoPriceString) { cardanoPriceLabel.text = String(format: "%.2f", cardanoResult) // 这里写你的后续业务逻辑 } else { // 解析失败时的兜底处理,比如显示错误提示 cardanoPriceLabel.text = "价格获取失败" } }
方案二:用SwiftyJSON的自动转换属性(谨慎使用)
如果你能确保API返回的价格字符串一定是合法数字格式,可以用SwiftyJSON提供的doubleValue属性,它会自动尝试把字符串转成Double:
func updateCardanoData(json : JSON) { let cardanoResult = json["ticker","price"].doubleValue // 注意:如果API返回的价格是0,这个判断会误判,所以更推荐方案一 if cardanoResult != 0 { cardanoPriceLabel.text = String(format: "%.2f", cardanoResult) } else { cardanoPriceLabel.text = "价格获取失败" } }
验证API返回结构(可选)
你可以先打印完整的JSON响应,确认字段类型:
print("完整JSON响应:\(json)")
输出的内容会类似这样(重点看price的引号):
{ "ticker": { "base": "ADA", "target": "AUD", "price": "0.47756685", "volume": "12345678.90", "change": "+0.01234567" }, "timestamp": 1620000000, "success": true, "error": "" }
内容的提问来源于stack exchange,提问作者Jasonds11
相关产品推荐
相关产品推荐

