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?
}
注意事项:
- 没有必要
demoData
.- 如果模型的属性名称与 JSON 中的键完全匹配,则无需显式指定
enum CodingKeys
。 - 由于在您的
init(from:)
中,在解析 JSON 时不会执行任何特定操作,因此您也可以避免这种情况。
您可以使用上述模型解析数据,例如:
if let data = data {
do {
let response = try JSONDecoder().decode(DemoModel.self, from: data)
print(response)
} catch {
print(error)
}
}