Вопрос:

Объединение нескольких JSON с идентификатором

json swift

17 просмотра

1 ответ

6 Репутация автора

Я пытаюсь получить данные из общедоступного API. Однако все необходимые мне данные доступны только по нескольким URL.

Тем не менее, каждый из JSONних имеет, station_idи я пытаюсь объединить данные на основе этого значения.

Я не уверен, какую стратегию я должен использовать, чтобы «объединить» результаты (см. Код ниже)

Я пытался вызвать оба URL одновременно.

Также попытался добавить данные со второго URL после вызова первого URL.

первый URL ( https://api-core.bixi.com/gbfs/es/station_information.json )

{"last_updated":1565466677,
 "ttl":10,
 "data":
      {"stations":
            [
            {"station_id":"25",
             "external_id":"0b100854-08f3-11e7-a1cb-3863bb33a4e4",
             "name":"de la Commune / Place Jacques-Cartier",
             "short_name":"6026",
             "lat":45.50761009451047,
             "lon":-73.55183601379395,
             "capacity":89,}]


// ...

Второй URL ( https://api-core.bixi.com/gbfs/en/station_status.json )

{"last_updated":1565466677,
 "ttl":10,
 "data":
      {"stations":
            [
            {"station_id":"25",
             "num_bikes_available": 39,
             "num_docks_available":50,}]


// ...

Исключенный результат (это структура, которую я ищу, а не окончательный код)

{"last_updated":1565466677,
 "ttl":10,
 "data":
      {"stations":
            [
            {"station_id":"25",
             "external_id":"0b100854-08f3-11e7-a1cb-3863bb33a4e4",
             "name":"de la Commune / Place Jacques-Cartier",
             "short_name":"6026",
             "lat":45.50761009451047,
             "lon":-73.55183601379395,
             "capacity":89,
             "num_bikes_available": 39,
             "num_docks_available":50}]

//...

Структура, в которой я пытался передать данные

struct BixiApiDataModel: Codable {

    let last_updated: Int
    let ttl: Int
    let data: Stations

}

struct Stations: Codable {

    let stations: [Station]

}

struct Station: Codable {

    let station_id: String
    let num_bikes_available: Int
    let num_docks_available: Int
    let external_id: String
    let name: String
    let short_name: String
    let lat: Float
    let lon: Float
    let capacity: Int

}

Вызов URL

class Webservice {

    func loadBixiApiDataModel(url: URL, completion: @escaping ([Station]?) -> ()) {

        URLSession.shared.dataTask(with: url) { data, response, error in

            guard let data = data, error == nil else {
                completion(nil)
                return
            }

            let response = try? JSONDecoder().decode(BixiApiDataModel.self, from: data)

            if let response = response {
                DispatchQueue.main.async {
                    completion(response.data.stations)
                }
            }

        }.resume()
    }

}

Я пытаюсь отобразить объединенную информацию о станции. Я предполагаю, что данные, которые я получаю после вызова первого URL-адреса, не сохраняются при вызове второго URL-адреса.

Должен ли я вызывать оба API по отдельности, хранить данные и затем объединять все, используя station_idзначение?

Или можно вызвать каждый API и добавить данные из второго URL на основе station_id?

Заранее спасибо за помощь.

Автор: Daymo502 Источник Размещён: 10.08.2019 09:54

Ответы (1)


0 плюса

14318 Репутация автора

Я бы сделал это так

  • Обрабатывать каждую загрузку отдельно
  • Храните полученные данные в отдельных структурах
  • Объедините их в третью структуру и затем используйте эту третью структуру внутри приложения

Обрабатывать каждую загрузку отдельно

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

Храните полученные данные в отдельных структурах

Поскольку содержимое загружаемых данных сильно отличается между вызовами API, я бы использовал для них две разные структуры, StationInformationи StationStatus. Глядя на тип данных, вы, возможно, захотите загружать статус чаще, чем информацию, которая кажется более статичной, что является еще одной причиной для их разделения.

Объединить их в третью структуру ...

Я хотел бы создать третью структуру, которая содержит информацию из двух других структур, либо просто как два свойства (показано ниже), либо со свойствами, которые извлекаются из других

Вот пример того, как можно реализовать третью структуру

struct Station {
    let information: StationInformation
    var status: StationStatus?

    init(information: StationInformation) {
        self.information = information
    }

    var id: String {
        return information.stationId
    }

    func merge(status: StationStatus) {
        guard self.id = status.stationId else { return }
        self.status = status
    }
}
Автор: Joakim Danielson Размещён: 11.08.2019 07:45
Вопросы из категории :
32x32