如何从 JSON API 解析和存储前一天
How to Parse and store previous day from JSON API
下面的代码访问 API 中的最新数据并将其存储在相应的结构中。
我现在需要访问前 4 天的数据并存储它们,但我不知道从哪里开始访问数据结构,或者是否可以在不将信息保存到数据库供以后访问的情况下这样做。
struct Root: Codable {
let metaData: [String: String]
let timeSeriesFX5Min: [String:Forex]
enum CodingKeys: String, CodingKey {
case timeSeriesFX5Min = "Time Series FX (DAILY)"
case metaData = "Meta Data"
}
}
// MARK: - TimeSeriesFX5Min
struct Forex: Codable {
let open, high, low, close: String
enum CodingKeys: String, CodingKey {
case open = "1. open"
case high = "2. high"
case low = "3. low"
case close = "4. close"
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let jsonUrlString = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=MSFT&apikey=demo"
let urlObj = URL(string: jsonUrlString)
URLSession.shared.dataTask(with: urlObj!) {(data, response, error) in
guard let data = data else { return }
do {
let forex = try JSONDecoder().decode(Root.self, from: data)
print(forex.metaData)
if let latestTime = forex.metaData["4. Last Refreshed"], let latestForex = forex.timeSeriesFX5Min[latestTime] {
}
} catch {
print(error)
}
}.resume()
}
}
timeSeriesFX5Min
(更好的timeSeriesDaily
)的key是"Time Series (Daily)"
.
struct Root: Codable {
let metaData: [String: String]
let timeSeriesDaily: [String:Forex]
enum CodingKeys: String, CodingKey {
case timeSeriesDaily = "Time Series (Daily)"
case metaData = "Meta Data"
}
}
过滤最新 4 个条目的最简单方法是获取键,对它们进行降序排序,然后从字典中提取给定键的前 4 个值
let forex = try JSONDecoder().decode(Root.self, from: data)
let sortedKeys = forex.timeSeriesDaily.keys.sorted(by: >)
let requestedKeys = sortedKeys.prefix(4)
var requestedPrices = [String:Forex]()
requestedKeys.forEach{ requestedPrices[[=11=]] = forex.timeSeriesDaily[[=11=]] }
print(requestedPrices)
下面的代码访问 API 中的最新数据并将其存储在相应的结构中。
我现在需要访问前 4 天的数据并存储它们,但我不知道从哪里开始访问数据结构,或者是否可以在不将信息保存到数据库供以后访问的情况下这样做。
struct Root: Codable {
let metaData: [String: String]
let timeSeriesFX5Min: [String:Forex]
enum CodingKeys: String, CodingKey {
case timeSeriesFX5Min = "Time Series FX (DAILY)"
case metaData = "Meta Data"
}
}
// MARK: - TimeSeriesFX5Min
struct Forex: Codable {
let open, high, low, close: String
enum CodingKeys: String, CodingKey {
case open = "1. open"
case high = "2. high"
case low = "3. low"
case close = "4. close"
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let jsonUrlString = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=MSFT&apikey=demo"
let urlObj = URL(string: jsonUrlString)
URLSession.shared.dataTask(with: urlObj!) {(data, response, error) in
guard let data = data else { return }
do {
let forex = try JSONDecoder().decode(Root.self, from: data)
print(forex.metaData)
if let latestTime = forex.metaData["4. Last Refreshed"], let latestForex = forex.timeSeriesFX5Min[latestTime] {
}
} catch {
print(error)
}
}.resume()
}
}
timeSeriesFX5Min
(更好的timeSeriesDaily
)的key是"Time Series (Daily)"
.
struct Root: Codable {
let metaData: [String: String]
let timeSeriesDaily: [String:Forex]
enum CodingKeys: String, CodingKey {
case timeSeriesDaily = "Time Series (Daily)"
case metaData = "Meta Data"
}
}
过滤最新 4 个条目的最简单方法是获取键,对它们进行降序排序,然后从字典中提取给定键的前 4 个值
let forex = try JSONDecoder().decode(Root.self, from: data)
let sortedKeys = forex.timeSeriesDaily.keys.sorted(by: >)
let requestedKeys = sortedKeys.prefix(4)
var requestedPrices = [String:Forex]()
requestedKeys.forEach{ requestedPrices[[=11=]] = forex.timeSeriesDaily[[=11=]] }
print(requestedPrices)