如何在模型 class (Swift) 中映射动态属性

How to map dynamic properties in model class (Swift)

我是 IOS 开发的新手,我遇到了一个非常有趣的情况,我有这个 json 响应来自服务器端

{ 
  "caps": {
    "first_key": "34w34",
    "first_char": "34w45",
    "first_oddo": "34w34"
          ....  : .....
          ....  : .....
  }
}

我的问题是 "caps" 对象中的键可以是动态的(比如如果再添加一个值会怎样)。我正在使用 ObjectMapper 映射器将值从响应映射到模型 class。我有这个型号 class

class User: Mappable {
    var first_key: String?
    var first_char: String?
    var first_oddo: String?
    required init?(map: Map) {
    }
    // Mappable
    func mapping(map: Map) {
        first_key   <- map["first_key"]
        first_char   <- map["first_char"]
        first_oddo    <- map["first_oddo"]

    }
}

现在,如果 json 响应中的值发生变化(因为它们是动态的),我不知道如何填充我的模型。我希望我已经解释清楚了。我想我不想在模型中使用硬编码值?

此解决方案使用 Swift 4.

引入的 Codable 协议

如果您的 JSON 的键是 动态的 那么您需要一个 Dictionary.

JSON

鉴于此 JSON

let data = """
{
"caps": {
    "first_key": "34w34",
    "first_char": "34w45",
    "first_oddo": "34w34"
}
}
""".data(using: .utf8)!

响应模型

你可以像这样定义一个结构

struct Response:Codable {
    let caps: [String:String]
}

解码

现在你可以解码你的 JSON

if let response = try? JSONDecoder().decode(Response.self, from: data) {
    print(response.caps)
}

输出

["first_key": "34w34", "first_oddo": "34w34", "first_char": "34w45"]