如何从 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)