如何在SwiftUI中为Alpha Vantage加密货币API的JSON数据创建对应变量
你调用的API没有问题,解析失败是因为返回的JSON是多层嵌套结构,且包含动态key的时间序列节点,你之前定义的单层结构体没有匹配对应的结构,正确的分层结构体定义如下:
1. 分层定义Codable结构体
import Foundation // 最内层:单条时间点的K线数据 struct CryptoKlineItem: Codable { let open: String let high: String let low: String let close: String let volume: Int // 映射JSON中带编号的key enum CodingKeys: String, CodingKey { case open = "1. open" case high = "2. high" case low = "3. low" case close = "4. close" case volume = "5. volume" } } // 元数据结构体:存储币种、间隔、市场等基础信息 struct CryptoMetaData: Codable { let symbol: String let currencyName: String let marketCode: String let interval: String let lastRefreshed: String let timeZone: String enum CodingKeys: String, CodingKey { case symbol = "2. Digital Currency Code" case currencyName = "3. Digital Currency Name" case marketCode = "4. Market Code" case interval = "7. Interval" case lastRefreshed = "6. Last Refreshed" case timeZone = "9. Time Zone" } } // 最外层:完整API响应结构 struct CryptoIntradayResponse: Codable { let metaData: CryptoMetaData // 时间序列是动态时间字符串为key的字典,匹配不同时间间隔的节点名 let timeSeries: [String: CryptoKlineItem] enum CodingKeys: String, CodingKey { case metaData = "Meta Data" case timeSeries = "Time Series Crypto (5min)" } }
2. 字段获取方式
- 你需要的
interval、币种、市场等信息直接从CryptoIntradayResponse的metaData属性中读取即可 - 所有时间点的
open/high/low/close(即你说的price)数据,遍历timeSeries字典的value即可获取,字典的key为对应K线的时间戳
注意事项
如果需要适配不同时间间隔的请求(比如1min、15min),可以把最外层CodingKeys里的timeSeries的rawValue改成动态拼接的参数,不需要重复定义结构体。
内容的提问来源于stack exchange,提问作者Wens Music
相关产品推荐
相关产品推荐

