Swift调用Covalent区块链API出现JSON解码错误如何解决?
问题原因和解决方案
- 核心问题1:Codable数据模型与API返回的JSON结构完全不匹配,这是解码报错的直接原因
你调用的Covalent API返回结构层级如下:
根节点 -> data字段(包含地址、计价货币、余额数组等) -> items字段(存储所有代币余额的数组)
你之前定义的Response模型直接查找根节点下的results数组,Result结构体的字段也和实际返回的字段完全对不上,解码时找不到对应键就会抛出keyNotFound错误。
- 核心问题2:
DispatchSemaphore用法错误,在SwiftUI主线程调用semaphore.wait()会直接阻塞主线程导致界面卡死,完全不需要用信号量处理URLSession异步回调。
修正后可运行代码
以下代码已经对齐API返回结构,移除了无效逻辑,运行后会自动在控制台打印前2条返回的余额数据:
import SwiftUI struct FetchingAPI: View { // 存储代币余额数组 @State private var balances = [BalanceItem]() var body: some View { Text("Fetching API") .onAppear(perform: loadData) } func loadData() { guard let url = URL(string: "https://api.covalenthq.com/v1/1/address/0x8f299f2908c9Cd71e723E7059Ac52eaea3638b2E/balances_v2/?&key=ckey_4eeea29a22c14701a9844f01151") else { print("Invalid URL") return } let request = URLRequest(url: url, timeoutInterval: 30) let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("请求错误:\(error)") return } guard let data = data else { print("无返回数据") return } do { let decoder = JSONDecoder() // 自动匹配JSON的蛇形命名和Swift的驼峰命名 decoder.keyDecodingStrategy = .convertFromSnakeCase let decodedResponse = try decoder.decode(CovalentResponse.self, from: data) DispatchQueue.main.async { self.balances = decodedResponse.data?.items ?? [] // 打印前2条余额数据 print("=== 前2条余额数据 ===") self.balances.prefix(2).forEach { print($0) } } return } catch { print("解码错误:\(error)") return } } task.resume() } } // MARK: 匹配Covalent API返回结构的Codable模型 struct CovalentResponse: Codable { let data: CovalentData? let error: Bool? let errorMessage: String? } struct CovalentData: Codable { let address: String? let quoteCurrency: String? let items: [BalanceItem] } struct BalanceItem: Codable, CustomStringConvertible { let contractName: String? let contractAddress: String? let balance: String? let quote: Double? var description: String { return "代币名称:\(contractName ?? "未知"),合约地址:\(contractAddress ?? "未知"),余额:\(balance ?? "0"),美元估值:\(quote ?? 0)" } }
内容的提问来源于stack exchange,提问作者ElKePoN
相关产品推荐
相关产品推荐

