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

Ниже приведен код, который используется для анализа API-интерфейса JSON. Код работает, и я могу проанализировать все значения JSON в приведенной ниже структуре, но я хотел бы знать, как анализировать только первый блок (?) / Массив и сохранять их в структуре, чтобы я мог выполнять над ними операции.

     let jsonUrlString = "https://www.alphavantage.co/query?function=FX_INTRADAY&from_symbol=EUR&to_symbol=USD&interval=5min&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.timeSeriesFX5Min)
            } catch {

                print(error)
            }

            }.resume()
    }
}

struct Root: Codable {
    let timeSeriesFX5Min: [String:Forex]

    enum CodingKeys: String, CodingKey {
        case timeSeriesFX5Min = "Time Series FX (5min)"
    }
}


    // MARK: - TimeSeriesFX5Min
    struct Forex: Codable {
        let the1Open, the2High, the3Low, the4Close: String

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

    }

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Я вижу два способа сделать это, первый требует изменения структуры Root, где нам нужно использовать часть метаданных сообщения

struct Root: Codable {
    let metaData: [String: String]
    let timeSeriesFX5Min: [String:Forex]

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

Затем мы выбираем элемент с надписью «Последнее обновление» и используем это значение для поиска последней записи цены в словаре временных рядов.

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] {
        print(latestForex)
    }        
} catch {
    print(error)
}

Другой вариант - воспользоваться тем фактом, что временные метки даны в таком формате, что их можно правильно отсортировать, поэтому вместо использования метаданных мы сортируем ключи и выбираем последний элемент

if let latestTime = forex.timeSeriesFX5Min.keys.sorted().last, let latestForex = forex.timeSeriesFX5Min[latestTime] {
     print(latestForex)
}
0 голосов
/ 19 июня 2019

Когда вы делаете запрос, вы, вероятно, уведомите, кто вызывает ваш метод, значением запроса, верно? Таким образом, вы создадите новый экземпляр вашего объекта или массива и заполните его результатом.

Если вы создадите в этой структуре, вы просто возьмете свой arrayObject и используете .first и выполните свою логику, следуя этому ...

Пример:

var newRoot: [Root] = [] 
func loadRoot() {
    Service().makeRequest() { (result, error) int
         newRoot = result.results
         print(newRoot.first)
    }
}

Функция «makeRequest ()» вызовет метод, который вы написали.

let jsonUrlString = "https://www.alphavantage.co/query?function=FX_INTRADAY&from_symbol=EUR&to_symbol=USD&interval=5min&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.timeSeriesFX5Min)
        } catch {

            print(error)
        }

        }.resume()
}
}
...