可编码以动态键解析JSON

问题描述 投票:0回答:2

我正在尝试解析以下具有多个动态键的JSON响应,

{
"Nagaland": {
    "districtData": {
      "Dimapur": {
        "confirmed": 1,
        "lastupdatedtime": "",
        "delta": {
          "confirmed": 0
        }
      }
    }
  },
  "Meghalaya": {
    "districtData": {
      "East Khasi Hills": {
        "confirmed": 1,
        "lastupdatedtime": "",
        "delta": {
          "confirmed": 0
        }
      }
    }
  }
}

我已经像下面那样编写了我的Codable结构,

struct IndianStateListModel: Codable {
    // MARK: Properties
    let state: [String: StateData]
}

struct StateData: Codable {
    // MARK: Properties
    var districtData: Inner?

    /// Mapping Key Enum
    private enum CodingKeys: String, CodingKey {
        case districtData
    }
}

struct Inner: Codable {
    // MARK: Properties
    let districts: [String: DistrictData]
}


struct DistrictData: Codable {
    // MARK: Properties
    var confirmed: Int?
    var lastupdatedtime: String?
    var delta: DailyConfirmedData?

    /// Mapping Key Enum
    private enum CodingKeys: String, CodingKey {
        case confirmed, lastupdatedtime, delta
    }
}

struct DailyConfirmedData: Codable {
    // MARK: Properties
    var confirmed: Int?

    /// Mapping Key Enum
    private enum CodingKeys: String, CodingKey {
        case confirmed
    }
}

称为,

let summary = try JSONDecoder().decode(IndianStateListModel.self, from: data)

但是返回nil

P.S .:有关可解码的Swift Codable with dynamic keys的相关问题

任何解决方案,都很好,请提前谢谢

ios json swift parsing codable
2个回答
1
投票

您必须用来解析上述JSON Codable[data模型应该是这样,

型号:

struct StateData: Codable {
    var districtData: [String:DistrictData]?
}

struct DistrictData: Codable {
    var confirmed: Int?
    var lastupdatedtime: String?
    var delta: DailyConfirmedData?
}

struct DailyConfirmedData: Codable {
    var confirmed: Int?
}

解析中:

let summary = try JSONDecoder().decode([String:StateData].self, from: data)

注意:如果JSON密钥与enum CodingKeys类型的属性完全匹配,则无需显式创建Codable


0
投票

根本的问题是IndianStateListModel具有称为states的属性。但是,您的JSON中没有此类密钥。我建议用singleValueContainer进行解析。例如。也许:

© www.soinside.com 2019 - 2024. All rights reserved.