我正在使用coinmarketcap api来获取硬币价格,使用下面的代码。数据模型Coin也在下面的代码和JSON响应之后给出。我得到一个错误:“数据无法读取,因为它的格式不正确。”正确的格式应该是什么样子的?
“”“
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)
}
}
}
}“”“
“”“
import SwiftUI
struct Coin: Decodable {
var slug: String?
var symbol: String?
enum CodingKeys: String, CodingKey {
case slug = "slug"
case symbol = "symbol"
}
}“”“
“”“
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;
}, ...“”“
发布于 2021-05-02 22:49:46
首先,我认为您可能希望删除示例中的API密钥并重置它。
关于你的问题。您的响应以data属性开始。为了解析它,你也需要从那里开始你的struct。
所以像这样的东西应该是可行的;
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并不完全熟悉。
此外,我认为你只能得到一组数据,而不是一组硬币。因此,我将在这里执行以下操作;
let coins = try JSONDecoder().decode(Coins.self, from: data)发布于 2021-05-02 22:52:06
您将整个响应解析为coins数组,但是您感兴趣的实际数据位于data key下,因此您需要添加一个附加层
struct Coins: Decodable {
let coins: [Coin]
}并解码它,而不是Coin
let coins = try JSONDecoder().decode(Coins.self, from: data)https://stackoverflow.com/questions/67357529
复制相似问题