如何使用 Swift 4 实现具有动态键的字典数组的可编码



API 响应是这样的

  "status": "SUCCESS",
  "mobile": "8856969696",
  "demo": [
    {
      "data1": "some"
    },
    {
      "data2": "value"
    }
  ],
  "pay": "12",
}

我试图像这样解析

struct demoModel : Codable {
    let status: String?
    let mobile: String?
    let demo : [demoData]?
    let pay: String?
    enum CodingKeys: String, CodingKey {
        case status = "status"
        case mobile  = "mobile"
        case demo = "demo"
        case pay = "pay"
    }
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        status = try values.decodeIfPresent(String.self, forKey: .status)
        mobile  = try values.decodeIfPresent(String.self, forKey: .mobile )
        demo = try values.decodeIfPresent([demoData].self, forKey: .demo)
        pay = try values.decodeIfPresent(String.self, forKey: .pay)
    }
}
struct demoData : Codable {
    let data1: String?
    enum CodingKeys: String, CodingKey {
        case data1 = "data1"
    }
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        data1 = try values.decodeIfPresent(String.self, forKey: .data1)
    }
}

这里的响应是有一个带有动态键的字典数组,请帮助我如何为动态键创建可编码的字典。提前谢谢。

请帮助我如何为动态键创建可编码的键。

好吧,Codable协议不是设计为具有动态密钥的,您需要显式声明每个密钥,这对于Codable是不可能的。

您必须为这些动态键使用[[String: String]]

可以

这样想,只要没有指定的静态键与值相关联,那么一切都被视为某物的值,因此在您的情况下demo是键,动态字典是最终值,您无法解码,因为解码需要一个键来解码它的值, 所以你不能有 动态键 .

试试这种方式。

class apiResponse{
 var status: String?
 var mobile: String?
 var demo = [[String:Any]]()
 var demoKeys = [String:Any]()
 init(json: [String:Any]){
     self.status = json?["status"] as? String ?? ""
     self.mobile = json?["mobile"] as? String ?? ""
     self.demoKeys = (json?["demo"] as AnyObject) as? [String:Any] ?? [:] 
     for item in demoKeys.keys{
         self.demo.append(json[item] as! [String:Any])
     }
 }
}

由于 demo 是具有动态键的dictionary array,因此您可以简单地使用类型 [String:String]dictionary,即

let demo : [[String:String]]?

您只需要创建一个模型来解析所有这些数据,即

struct DemoModel : Codable {
    let status: String?
    let mobile: String?
    let demo : [[String:String]]?
    let pay: String?
}

注意事项:

    没有必要
  1. demoData.
  2. 如果模型的属性名称与 JSON 中的键完全匹配,则无需显式指定 enum CodingKeys
  3. 由于在您的init(from:)中,在解析 JSON 时不会执行任何特定操作,因此您也可以避免这种情况。

您可以使用上述模型解析数据,例如:

if let data = data {
    do {
        let response = try JSONDecoder().decode(DemoModel.self, from: data)
        print(response)
    } catch {
        print(error)
    }
}

相关内容

  • 没有找到相关文章

最新更新