簡體   English   中英

Swift Codable JSON 使用 JSONDecoder 解析錯誤

[英]Swift Codable JSON parse error with JSONDecoder

我正在嘗試使用 Codable 處理 JSON,但是當我使用 JSONDecoder().decode 對其進行解碼時出現解析錯誤。

{
    "data": [
        {
            "id": "90",
            "symbol": "BTC",
            "name": "Bitcoin",
            "nameid": "bitcoin",
            "rank": 1,
            "price_usd": "50513.75",
            "percent_change_24h": "3.03",
            "percent_change_1h": "-0.50",
            "percent_change_7d": "-9.91",
            "price_btc": "1.00",
            "market_cap_usd": "942710364520.73",
            "volume24": 70745042591.75044,
            "volume24a": 107034995571.4168,
            "csupply": "18662452.00",
            "tsupply": "18662452",
            "msupply": "21000000"
        },
        {
            "id": "80",
            "symbol": "ETH",
            "name": "Ethereum",
            "nameid": "ethereum",
            "rank": 2,
            "price_usd": "4052.44",
            "percent_change_24h": "10.17",
            "percent_change_1h": "-0.78",
            "percent_change_7d": "17.75",
            "price_btc": "0.084812",
            "market_cap_usd": "466734637594.73",
            "volume24": 53134000887.50444,
            "volume24a": 87082811090.79503,
            "csupply": "115173595.00",
            "tsupply": "115173595",
            "msupply": ""
        }
    ],
    "info": {
        "coins_num": 5949,
        "time": 1621022046
    }
}

json 就像上面一樣,我對所有模型都進行了如下編碼。

class CoinModel: Codable {
    var data: [Coin]?
    var info: CoinInfo?
    
    enum CodingKeys: String, CodingKey {
        case data
        case info
    }
}

class CoinInfo: Codable {
    var coinsNum: Int?
    var time: TimeInterval?
    
    enum CodingKeys: String, CodingKey {
        case coinsNum = "coins_num"
        case time = "time"
    }
}
class Coin: Codable{
    var csupply: String?
    var id: String?
    var marketCapUsd: String?
    var msupply: Int?
    var name: String?
    var nameid: String?
    var percentChange1h: String?
    var percentChange24h: String?
    var percentChange7d: String?
    var priceBtc: String?
    var priceUsd: String?
    var rank: Int?
    var symbol: String?
    var tsupply: Int?
    var volume24: Double?
    var volume24a: Double?

    enum CodingKeys: String, CodingKey {
        case csupply = "csupply"
        case id = "id"
        case marketCapUsd = "market_cap_usd"
        case msupply = "msupply"
        case name = "name"
        case nameid = "nameid"
        case percentChange1h = "percent_change_1h"
        case percentChange24h = "percent_change_24h"
        case percentChange7d = "percent_change_7d"
        case priceBtc = "price_btc"
        case priceUsd = "price_usd"
        case rank = "rank"
        case symbol = "symbol"
        case tsupply = "tsupply"
        case volume24 = "volume24"
        case volume24a = "volume24a"
    }
}

我的網絡 function 工作如下。

URLSession.shared.dataTask(with: url) { (data, response, error) in
    guard error == nil else {
        completion(.failure(error!))
        return
    }
    
    guard let data = data else {
        completion(.failure(error ?? NSError()))
        return
    }
    
    let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String: Any]
    
    guard let model = try? JSONDecoder().decode(CoinModel.self, from: data) else {
        completion(.success([]))
        return
    }
    
    completion(.success(model.data ?? []))
    
}.resume()

正如我之前所說,json object 不是零,我得到如下所示。

[({
    csupply = "435032301.00";
    id = 33285;
    "market_cap_usd" = "435337535.24";
    msupply = "";
    name = "USD Coin";
    nameid = "usd-coin";
    "percent_change_1h" = "0.01";
    "percent_change_24h" = "0.19";
    "percent_change_7d" = "0.16";
    "price_btc" = "0.000023";
    "price_usd" = "1.00";
    rank = 100;
    symbol = USDC;
    tsupply = 435032301;
    volume24 = "11520659193.03477";
    volume24a = "13684311331.83874";
}
)
, "info": {
    "coins_num" = 5952;
    time = 1621160044;
}]

我可以使用 JSONSerialization 處理 JSON 但我找不到任何原因導致JSONDecoder方式解析錯誤。 我想我沒有看到問題。 感謝您的任何建議和幫助。

編輯:

我通過對我的 Codable class 進行了一些更改來解決它,當我為idcsupply等描述 model 時我犯了一個錯誤。

var csupply: String?
var msupply: String?
var tsupply: String?

您在定義 object 時有幾個錯誤。 例如,您定義了idmsupply是 integer 但它們是字符串。 您已經定義了volume24volume24a是字符串,但它們不是。 您需要解決所有這些問題,這可能就是您無法解析它的原因。

所有錯誤定義的參數是idmSupplyvolume24volume24atSupply硬幣 object 和info object 您還需要將time轉換為Int

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM