【问题标题】:How can I get data from inside a changing element in JSON from an API? SWIFT如何从 API 的 JSON 中不断变化的元素中获取数据?迅速
【发布时间】:2022-01-04 16:08:50
【问题描述】:

我需要从格式如下的特定 API 获取数据:

{
  "dates": {
    "2021-10-01": {....},
    "2021-10-02": {....},
    "2021-10-03": {....},
    "2021-10-04": {....},
    "2021-10-05": {....},
    ......
    ......

我需要访问这些数据:

{
  "dates": {
    "2021-10-01": {
      "countries": {
        "Spain": {
          "date": "2021-10-01",
          "id": "spain",
          "name": "Spain",
          "name_es": "España",
          "name_it": "Spagna",
          "regions": [
            {
              "date": "2021-10-01",
              "id": "andalucia",
              "name": "Andalucía",
              "name_es": "Andalucía",
              "name_it": "Andalucía",
              "source": "John Hopkins University",

所以,我已经实现了使用JSONDecoder().decode() 解码数据的下一个结构:

struct AutonomousComunityDataResponse: Decodable {
    let dates : datesData
}

struct datesData: Decodable {
    let date : spain
}

struct spain: Decodable {
    let countries : country2
}

struct country2: Decodable {
    let Spain : regionsSpain
}

struct regionsSpain: Decodable {
    let regions : [regionSpain]
}

struct regionSpain: Decodable {
    let date: String
    let today_new_confirmed: Int
}

解码数据时出现错误,因为

keyNotFound(CodingKeys(stringValue: "date", intValue: nil), Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "dates", intValue: nil)],
debugDescription: "No value associated with key CodingKeys(stringValue: \"date\", intValue: nil) (\"date\").", underlyingError: nil))

我不知道如何实现这个来获取数据。我想到了类似循环的东西,只需将 1 添加到变量中,例如:2020-10-01+1。

我被困在这部分了。

【问题讨论】:

  • 您的解析失败。但如果不知道您的 JSON 是什么样子,就很难准确判断出什么问题。
  • @Larme 知道可见
  • 你应该使用字典而不是let dates : datesData 它应该是let dates : [String: datesData]let countries : [String: Country] 等等。这也意味着你可以删除一些你已经定义的类型。题外话,但请以大写字母开头结构名称以提高可读性。
  • @ÁlvaroR 这有帮助吗? -- stackoverflow.com/questions/50713638/…

标签: json swift api struct jsondecoder


【解决方案1】:

请使用此编码器解析数据。

    import Foundation

// MARK: - AutonomousComunityDataResponse
struct AutonomousComunityDataResponse: Codable {
    let dates: [String: DateValue]
}

// MARK: - DateValue
struct DateValue: Codable {
    let countries: Countries
}

// MARK: - Countries
struct Countries: Codable {
    let spain: Spain

    enum CodingKeys: String, CodingKey {
        case spain = "Spain"
    }
}

// MARK: - Spain
struct Spain: Codable {
    let date, id, name, nameEs: String
    let nameIt: String
    let regions: [Spain]?
    let source: String?

    enum CodingKeys: String, CodingKey {
        case date, id, name
        case nameEs = "name_es"
        case nameIt = "name_it"
        case regions, source
    }
}

let parsedData = try? newJSONDecoder().decode(AutonomousComunityDataResponse.self, from: jsonData)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-03
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多