首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Coinbase API解析到Swift App返回不正确的格式

Coinbase API解析到Swift App返回不正确的格式
EN

Stack Overflow用户
提问于 2021-05-02 22:31:13
回答 2查看 133关注 0票数 0

我正在使用coinmarketcap api来获取硬币价格,使用下面的代码。数据模型Coin也在下面的代码和JSON响应之后给出。我得到一个错误:“数据无法读取,因为它的格式不正确。”正确的格式应该是什么样子的?

“”“

代码语言:javascript
复制
import Foundation
import SwiftUI
import Alamofire

class CryptoViewModel: ObservableObject {
    
    func fetchData() {
        let headers: HTTPHeaders = [
            "Accepts": "application/json",
              "X-CMC_PRO_API_KEY": "5dd693fc-6446-44c4-8aaa-75b1bfa4376f"
        ]
        
        AF.request("https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest", headers: headers).response { response in
            guard let data = response.data else { return }
            
            do {
                let coins = try JSONDecoder().decode([Coin].self, from: data)
                print(coins)
            }
            catch {
                print(error.localizedDescription)
            }
            
        }
        
    }
    
}

“”“

“”“

代码语言:javascript
复制
import SwiftUI

struct Coin: Decodable {
    
    var slug: String?
    var symbol: String?
    
    enum CodingKeys: String, CodingKey {
        case slug = "slug"
        case symbol = "symbol"
    }
}

“”“

“”“

代码语言:javascript
复制
success({
    data =     (
                {
            "circulating_supply" = 18697137;
            "cmc_rank" = 1;
            "date_added" = "2013-04-28T00:00:00.000Z";
            id = 1;
            "last_updated" = "2021-05-02T14:22:02.000Z";
            "max_supply" = 21000000;
            name = Bitcoin;
            "num_market_pairs" = 9549;
            platform = "<null>";
            quote =             {
                USD =                 {
                    "last_updated" = "2021-05-02T14:22:02.000Z";
                    "market_cap" = "1063000586851.752";
                    "percent_change_1h" = "0.09591311";
                    "percent_change_24h" = "-1.05109813";
                    "percent_change_30d" = "-4.45794679";
                    "percent_change_60d" = "11.80459387";
                    "percent_change_7d" = "14.06195861";
                    "percent_change_90d" = "69.54985569999999";
                    price = "56853.65555441735";
                    "volume_24h" = "40969975368.50657";
                };
            };
            slug = bitcoin;
            symbol = BTC;
            tags =             (
                mineable,
                pow,
                "sha-256",
                "store-of-value",
                "state-channels",
                "coinbase-ventures-portfolio",
                "three-arrows-capital-portfolio",
                "polychain-capital-portfolio",
                "binance-labs-portfolio",
                "arrington-xrp-capital",
                "blockchain-capital-portfolio",
                "boostvc-portfolio",
                "cms-holdings-portfolio",
                "dcg-portfolio",
                "dragonfly-capital-portfolio",
                "electric-capital-portfolio",
                "fabric-ventures-portfolio",
                "framework-ventures",
                "galaxy-digital-portfolio",
                "huobi-capital",
                "alameda-research-portfolio",
                "a16z-portfolio",
                "1confirmation-portfolio",
                "winklevoss-capital",
                "usv-portfolio",
                "placeholder-ventures-portfolio",
                "pantera-capital-portfolio",
                "multicoin-capital-portfolio",
                "paradigm-xzy-screener"
            );
            "total_supply" = 18697137;
        }, ...

“”“

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-02 22:49:46

首先,我认为您可能希望删除示例中的API密钥并重置它。

关于你的问题。您的响应以data属性开始。为了解析它,你也需要从那里开始你的struct。

所以像这样的东西应该是可行的;

代码语言:javascript
复制
struct Coins: Decodable {
    let data: [Coin]

    struct Coin: Decodable {
        let symbol: String
        let slug: String
        let quote: [String: Quote]
    }

    struct Quote: Decodable {
        let price: Double
    }
}

我嵌套了结构以保留名称空间。每件事都是非常相关的。如果你需要单独访问它们中的一个,你可以把它们拉出来。

此外,您可以省略CodingKeys,因为该键与您的变量名相同。此外,我认为你不需要选项,但我对API并不完全熟悉。

此外,我认为你只能得到一组数据,而不是一组硬币。因此,我将在这里执行以下操作;

代码语言:javascript
复制
let coins = try JSONDecoder().decode(Coins.self, from: data)
票数 1
EN

Stack Overflow用户

发布于 2021-05-02 22:52:06

您将整个响应解析为coins数组,但是您感兴趣的实际数据位于data key下,因此您需要添加一个附加层

代码语言:javascript
复制
struct Coins: Decodable {
    let coins: [Coin]
}

并解码它,而不是Coin

代码语言:javascript
复制
let coins = try JSONDecoder().decode(Coins.self, from: data)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67357529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档