如何映射模型类中的动态属性(Swift)

时间:2017-11-11 17:25:46

标签: json swift oop objectmapper

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

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

我的问题是“caps”对象内的键可以是动态的(就像添加了一个更多的值一样)。我正在使用ObjectMapper映射器来映射从响应到模型类的值。我有这个模型类

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响应中的值被更改(因为它是动态的),如何填充我的模型。我希望我已经解释得很好。我想我不想在模型中使用硬编码值吗?

1 个答案:

答案 0 :(得分:0)

此解决方案使用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"]