Swift 4具有随机密钥属性的可解码嵌套JSON



我在解码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,它将接受您投掷的任何随机字符串值。

相关内容

  • 没有找到相关文章

最新更新