gpt4 book ai didi

json - 使用 Codable 协议(protocol)解析包含日期作为键的 Stock API

转载 作者:可可西里 更新时间:2023-11-01 01:48:54 26 4
gpt4 key购买 nike

我正在尝试解析来自 Alpha Vantage 的股票 api。这是一个响应的样子:API Response Demo

我设置了四个类用于解码和编码:

  1. 股票
  2. 元数据
  3. 时间序列
  4. 高开低收

我认为问题出在时间序列类中,因为我想获取一个数组日期作为键,每个日期都包含开盘价、收盘价、高价、低值。这三个类都符合 Codable 协议(protocol)。我更改了枚举中​​键的值,以便它可以匹配正确的 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"
}
}

最佳答案

以下是正确的数据类型 w.r.t 你的回应

// MARK: - Response
struct Response: Codable {
let metaData: MetaData
let timeSeries5Min: [String: TimeSeries5Min]

enum CodingKeys: String, CodingKey {
case metaData = "Meta Data"
case timeSeries5Min = "Time Series (5min)"
}
}

// MARK: - MetaData
struct MetaData: Codable {
let the1Information, the2Symbol, the3LastRefreshed, the4Interval: String
let the5OutputSize, the6TimeZone: String

enum CodingKeys: String, CodingKey {
case the1Information = "1. Information"
case the2Symbol = "2. Symbol"
case the3LastRefreshed = "3. Last Refreshed"
case the4Interval = "4. Interval"
case the5OutputSize = "5. Output Size"
case the6TimeZone = "6. Time Zone"
}
}

// MARK: - TimeSeries5Min
struct TimeSeries5Min: Codable {
let the1Open, the2High, the3Low, the4Close: String
let the5Volume: String

enum CodingKeys: String, CodingKey {
case the1Open = "1. open"
case the2High = "2. high"
case the3Low = "3. low"
case the4Close = "4. close"
case the5Volume = "5. volume"
}
}

用法:

  func loadURL() {
let stocksURL = URL(string: "https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=5min&apikey=demo")
URLSession.shared.dataTask(with: stocksURL!) { (data, response, error) in
if let error = error {
print(error)
return
}
do {
let response = try JSONDecoder().decode(Response.self, from: data!)
response.timeSeries5Min.forEach({ (keyValue) in
print(keyValue)
})
} catch {
print(error)
}
}.resume()
}

关于json - 使用 Codable 协议(protocol)解析包含日期作为键的 Stock API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56485249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com