获取 API 时解码失败 |迅速

当我打印 self.getTokenBalancesModel 时,它给了我解码失败的错误。我做错了什么?

视图模型

import Foundation
import Alamofire

final class TokenBalancesClassAViewModel: ObservableObject {
    
    @Published var getTokenBalancesModel: [GetTokenBalancesItemsModel] = [GetTokenBalancesItemsModel]()
    
    func makeApiRequest() {
        let url = "https://api.covalenthq.com/v1/1/address/0x726A73081C4134b2f639b821377482c71864EBc8/balances_v2/?&key=ckey_4eeea29a22c14701a9844f01151"
        
        AF.request(url).responseData(completionHandler: { data in
            if let apiJsonData = try? JSONDecoder().decode(TokenBalancesModel.self,from: data.data!){
                self.getTokenBalancesModel = apiJsonData.data.items
                print(self.getTokenBalancesModel)
            } else {
                print("Decoding failed")
            }
        })
    }
}

模型

struct TokenBalancesModel: Codable,Hashable {
    let data: TokenBalancesDataModel
    let error: Bool
}

struct TokenBalancesDataModel: Codable,Hashable {
    let address: String
    let quote_currency: String
    let items: [TokenBalancesItemsModel]
}

struct TokenBalancesItemsModel: Codable,Hashable {
    let contract_name: String
    let contract_ticker_symbol: String
//    let logo_url: String
    let balance: Int
    let quote_rate: Float
    let quote: Float
}

它显然在解码部分:

if let apiJsonData = try? JSONDecoder().decode(TokenBalancesModel.self,from: data.data!){

我哪里出错了,但我不明白为什么

sunlei890325sunlei 回答:获取 API 时解码失败 |迅速

相反,如果您发现错误,您将获得更多信息 try?

调试常见的catch链时,我将使用

} catch let DecodingError.dataCorrupted(context) {
    print(context)
} catch let DecodingError.keyNotFound(key,context) {
    print("Key '\(key)' not found:",context.debugDescription)
    print("codingPath:",context.codingPath)
} catch let DecodingError.valueNotFound(value,context) {
    print("Value '\(value)' not found:",context.codingPath)
} catch let DecodingError.typeMismatch(type,context) {
    print("Type '\(type)' mismatch:",context.codingPath)
} catch {
    print("error: ",error)
}

使用上面的你会看到以下错误

类型 'Int' 不匹配:预期解码 Int 但找到了字符串/数据。 codingPath: [CodingKeys(stringValue: "data",intValue: nil),CodingKeys(stringValue: "items",_JSONKey(stringValue: "Index 0",intValue: 0),CodingKeys(stringValue: "balance",intValue: nil)]

这会引起您对 TokenBalancesItemsModel.balance 字段类型错误的注意。

,

使用这个,注意选项:

struct TokenBalancesModel: Codable,Hashable {
    let data: TokenBalancesDataModel
    let error: Bool
}

struct TokenBalancesDataModel: Codable,Hashable {
    let address: String?
    let quote_currency: String?
    let items: [TokenBalancesItemsModel]
}

struct TokenBalancesItemsModel: Codable,Hashable {
    let contract_name: String?
    let contract_ticker_symbol: String?
//    let logo_url: String
    let balance:  String?    // <-- here no Int
    let quote_rate: Float?
    let quote: Float?
}
本文链接:https://www.f2er.com/45119.html

大家都在问