我在解码JSON时遇到问题。我遵循了很多教程,但不使用复杂的JSON结构。为简单起见,我最大程度地减少了代码,并以狗为例。
在跟随JSON时,我大多只对狗结构感兴趣。 JSON"数据"属性包含随机的狗名称。因此,我无法使用编码键,因为我不知道属性名称。
{
"Response": "success"
"BaseLinkUrl": "https://wwww.example.com",
"Data": {
"Max": {
"name": "Max",
"breed": "Labrador"
},
"Rocky": {
"name": "Rocky",
"breed": "Labrador"
},
...
}
}
我有以下结构:
struct DogResponse : Decodable {
let data : DogResponseData
enum CodingKeys: String, CodingKey {
case data = "Data"
}
}
struct DogResponseData: Decodable {
let dog: Dog //this is a random variable name
enum CodingKeys: String, CodingKey {
case dog = "??random_variable_dog_name??"
}
}
struct Dog: Decodable {
let name: String
let type: String
enum CodingKeys: String, CodingKey {
case name
case type = "breed"
}
}
收集狗结构:
let dogResponse = try JSONDecoder().decode(DogResponse.self, from: data)
print(dogResponse)
我需要在" dogresponsedata"结构中做什么才能识别包含我的狗结构的随机变量?
一个可能的解决方案是编写自定义初始化器以将字典解码为 [String:Dog]
并将值映射到数组
struct Dog : Decodable {
let name : String
let breed : String
}
struct DogResponse : Decodable {
let dogs : [Dog]
private enum CodingKeys: String, CodingKey {
case data = "Data"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
let data = try values.decode([String : Dog].self, forKey: .data)
dogs = Array(data.values)
}
}
let dogResponse = try JSONDecoder().decode(DogResponse.self, from: data)
print(dogResponse.dogs)
====================================================================================
,或者如果要保持字典结构,它仍然短
struct Dog : Decodable {
let name : String
let breed : String
}
struct DogResponse : Decodable {
let dogs : [String : Dog]
private enum CodingKeys: String, CodingKey {
case dogs = "Data"
}
}
值得记住的是,CodingKey
是协议,不一定是enum
。因此,您可以将其制作为struct
,它将接受您投掷的任何随机字符串值。