【发布时间】:2019-06-06 21:20:53
【问题描述】:
我正在尝试解析来自 Alpha Vantage 的股票 api。
这是响应的样子:API Response Demo
我设置了四个类用于解码和编码:
- 股票
- 元数据
- 时间序列
- 高开低收
我认为问题出在时间序列类中,因为我想将数组日期作为键,每个日期都包含打开、关闭、高、低值。所有三个类都符合Codable 协议。我更改了枚举中键的值,以便它可以匹配正确的JSON Response。
var stocks = [Stocks]()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
loadURL()
}
func loadURL(){
let stocksURL = URL(string: "https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=5min&apikey=demo")
print("Inside loadURL")
guard let url = stocksURL else { return }
if let data = try? Data(contentsOf: url){
print("Inside data")
parse(json: data)
}
}
func parse(json: Data){
let jsonDecoder = JSONDecoder()
print("before Decoding")
if let json = try? jsonDecoder.decode([Stocks].self, from: json){
print("Inside parsing")
stocks = json
print(stocks[0].meta_data.symbol)
print(stocks[0].time_series.OHLC[0].open)
}
}
}
class Stocks: Codable {
var meta_data: MetaData
var time_series: TimeSeries
enum CodingKeys: String, CodingKey {
case meta_data = "Meta Data"
case time_series = "Time Series (5min)"
}
}
class MetaData: Codable {
var information: String
var symbol: String
var lastRefreshed: String
var outputSize: String
var timeZone: String
enum CodingKeys: String, CodingKey {
case information = "1. Information"
case symbol = "2. Symbol"
case lastRefreshed = "3. Last Refreshed"
case outputSize = "4. Output Size"
case timeZone = "5. Time Zone"
}
}
class TimeSeries: Codable {
var OHLC: [OpenHighLowClose]
}
class OpenHighLowClose: Codable {
var open: Double
var high: Double
var low: Double
var close: Double
var volume: Double
enum CodingKeys: String, CodingKey {
case open = "1. open"
case high = "2. high"
case low = "3. low"
case close = "4. close"
case volume = "5. volume"
}
}
【问题讨论】:
-
与您的问题无关,但从不使用
Data(contentsOf:)在主队列上加载远程数据。很坏。使用URLSession获取数据。正确接受加载远程数据的异步特性。
标签: json swift parsing codable