gpt4 book ai didi

json - 具有随机键属性的 Swift 4 可解码嵌套 json

转载 作者:行者123 更新时间:2023-12-05 00:37:15 25 4
gpt4 key购买 nike

我在解码 json 时遇到问题。我已经学习了很多教程,但没有使用复杂的 json 结构。为简单起见,我将代码最小化并以 Dog 为例。

在关注 json 时,我主要只对 Dog 结构感兴趣。 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”结构中做什么才能快速识别包含我的 Dog 结构的随机变量?

最佳答案

一个可能的解决方案是编写一个自定义初始化程序来将字典解码为 [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"
}
}

关于json - 具有随机键属性的 Swift 4 可解码嵌套 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47607395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com