Декодирование в формате JSON Дата в SwiftUI - PullRequest
0 голосов
/ 22 апреля 2020

Как я могу получить доступ к данным в этом JSON с этого сайта https://corona.lmao.ninja/v2/historical/usacounties/florida?lastdays=1

{
    "province": "florida",
    "county": "bay",
    "timeline": {
      "cases": {
        "4/20/20": 57 //How can I name this line inside of struct Cases
      },
      "deaths": {
        "4/20/20": 2 
      }
    }
  }

Это можно декодировать JSON в SwiftUI

struct Florida: Codable, Identifiable {
    let id = UUID()
    var county: String
    var timeline: Cases
}
struct Cases: Codable, Identifiable {
    let id = UUID()
    var cases: ?????
}

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

я знаю, что это не "реальное" решение, но только для ЭТОГО случая - один раз прочитайте ... это сработает: (и теперь вы знаете хотя бы как назвать дело ...)

struct WelcomeElement: Codable {
    let province: Province
    let county: String
    let timeline: Timeline
}

enum Province: String, Codable {
    case florida = "florida"
}

// MARK: - Timeline
struct Timeline: Codable {
    let cases, deaths: Cases
}

// MARK: - Cases
struct Cases: Codable {
    let the42120: Int

    enum CodingKeys: String, CodingKey {
        case the42120 = "4/21/20"
    }
}

typealias Welcome = [WelcomeElement]


struct ContentView: View {

    let dataArray : Welcome = []

    init() {

        let url = URL(string: "https://corona.lmao.ninja/v2/historical/usacounties/florida?lastdays=1")
        let request = URLRequest(url: url!)

        URLSession.shared.dataTask(with: request) { data, response, error in
            if let decodedResponse = try? JSONDecoder().decode(Welcome.self, from: data!) {

                print(decodedResponse)
            }

        }.resume()

    }

    var body: some View {
        Text("Hello, World!")
    }
}

более общий подход, если вы измените последние дни на большее количество дней, вы можете использовать:

// MARK: - WelcomeElement
struct WelcomeElement: Codable {
    let province: Province
    let county: String
    let timeline: Timeline
}

enum Province: String, Codable {
    case florida = "florida"
}

// MARK: - Timeline
struct Timeline: Codable {
    let cases, deaths: [String: Int]
}

typealias Welcome = [WelcomeElement]

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

, если честно, данные, которые предоставляет сервер, не очень полезны. если бы они указали такую ​​дату:

{ "date" : "18/07/18",
  "death" : 2
}

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

1 голос
/ 22 апреля 2020
var cases: [String: Int]

Cases - это словарь. Вы не можете сделать его кодируемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...