如何在模型 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"]
我是 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"]