如何使用 SWIFT 解码协议来解析嵌套的 JSON 数据?



我有一个从服务器获取一些JSON数据的应用程序,如下所示:

"operationsInfo": {
"bill": {
"activeProviders": [
{
"max": 50,
"min": 10,
"name": "name1"
},
{
"max": 50,
"min": 10,
"name": "name2"
}
]
},
"pin": {
"activeProviders": [
{
"max": 50,
"min": 10,
"name": "name3"
},
{
"max": 50,
"min": 10,
"name": name4
}
]
}
}

如何使用 SWIFT 解码协议来反序列化此 JSON 数据? 我的自定义对象如下所示:

struct operationList: Decodable {
let name: String
let action: String
let min, max: Int
}

操作列表对象中的操作值必须等于"账单"或"固定"。 最后,我想在解码JSON数据时获取一个operationList对象类型的数组,例如:

let operationListArray = [operationList1, operationList2, operationList3, operationList4] 操作列表1.操作 = "账单", 操作列表 1.max = 50, operationList1.name = "名称 1" 操作列表2.操作 = "bill", 操作列表2.max = 50, operationList2.name = "name2" 操作列表3.操作 = "pin", 操作列表3.max = 50, operationList3.name = "name3" 操作列表4.操作 = "pin", 操作列表4.max = 50, operationList4.name = "name4">

我已经看到了其他类似的答案,例如:如何使用 Swift 解码协议解码嵌套的 JSON 结构? 但我的问题是如何将"账单"或"pin"放在操作值中,将来可能会将"传输"(如"pin"或"bill"(等新键值添加到 JSON 数据中。

正如@rmaddy评论中提到的,您希望分两步执行此操作。

首先,创建一个与您的 JSON 格式匹配的结构并对其进行解码:

struct Response: Decodable {
let operationsInfo: [String: Providers]
}
struct Providers: Decodable {
let activeProviders: [Provider]
}
struct Provider: Decodable {
let name: String
let min: Int
let max: Int
}
let response = try JSONDecoder().decode(Response.self, from: data)

然后,声明一个结构,该结构表示您希望数据采用的格式并映射它:

struct ProviderAction {
let action: String
let provider: Provider
}
let actions: [ProviderAction] = response.operationsInfo.map { action, providers in
providers.activeProviders.map { ProviderAction(action: action, provider: $0) }
}.flatMap { $0 }

相关内容

  • 没有找到相关文章

最新更新