Как разобрать и сохранить предыдущий день из JSON API - PullRequest
0 голосов
/ 08 июля 2019

Приведенный ниже код обращается к самым последним данным из 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()

    }

}

1 Ответ

0 голосов
/ 08 июля 2019

Ключ timeSeriesFX5Min (лучше timeSeriesDaily) - "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[$0] = forex.timeSeriesDaily[$0] }
    print(requestedPrices)
...