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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 12:36:03