如何使用来自 API 调用的动态变量解码嵌套的 JSON 结构
How to decode a nested JSON struct with dynamic variable from API call
调用此特定 API 时,其中一个变量会根据结果发生变化。
示例:
{
"map": {
"1945206": {
"installBaseNUMB": 0,
"serialNumber": "KB1",
...
}
}
}
1945206 将更改为另一个数字,我不知道如何正确解码它。
我的 Codable 结构如下:
struct Map: Codable {
let the1945206: The1945206?
enum CodingKeys: String, CodingKey {
case the1945206 = "1945206"
}
}
struct The1945206: Codable {
let installBaseNUMB: Int?
let serialNumber, woStatus: String?
let workOrderNumber: Int?
let woNotes: [String]?
let woParts: [WoPart]?
}
如果 1945206 更改为另一个值,它将中断并且不会显示任何结果。如何在解码数据时使用动态变量?
你可以试试
struct Root : Codable {
let map: [String:The1945206]
}
let res = try? JSONDecoder().decode(Root.self,from:data)
print(res?.map.values)
{
"map": {
"1945204": {
"installBaseNUMB": 0,
"serialNumber": "KB1",
...
},
"1945205": {
"installBaseNUMB": 0,
"serialNumber": "KB1",
...
},
"1945206": {
"installBaseNUMB": 0,
"serialNumber": "KB1",
...
}
}
}
我建议设置与 The1945206
不同的名称,因为它的可读性较差。我将使用 MapElement
代替。如果您知道 map 将只有一个元素,并且不想检查与该值关联的键是什么,则可以使用 computed 属性 var value:MapElement?
来获取它。它 returns 是可选的,因为 let map:[String:MapElement]
字典可以为空。
let json = """
{
"map": {
"1945206": {
"installBaseNUMB": 0,
"serialNumber": "KB1"
}
}
}
""".data(using: .utf8)!
struct Container: Codable {
let map:[String:MapElement]
var value:MapElement? {
return map.values.first
}
}
struct MapElement: Codable {
let installBaseNUMB: Int
let serialNumber: String
}
let res = try? JSONDecoder().decode(Container.self,from:json)
print(res?.value as Any)
更新:
如果你想使用多个 MapElement
,你可以像这样将 var value:MapElement
更改为 var values:[MapElement]
:
struct Container: Codable {
let map:[String:MapElement]
var values:[MapElement] {
return map.values
}
}
但请记住,您将数据存储为字典,因此无法保证元素的顺序。
试试这个:
struct Install: Decodable {
let installBaseNUMB: Int, serialNumber: String
}
let installData = try? JSONDecoder().decode([String:[String:Install]].self, from: jsonData2!)
let install = installData?.values.first?.values.first
调用此特定 API 时,其中一个变量会根据结果发生变化。
示例:
{
"map": {
"1945206": {
"installBaseNUMB": 0,
"serialNumber": "KB1",
...
}
}
}
1945206 将更改为另一个数字,我不知道如何正确解码它。
我的 Codable 结构如下:
struct Map: Codable {
let the1945206: The1945206?
enum CodingKeys: String, CodingKey {
case the1945206 = "1945206"
}
}
struct The1945206: Codable {
let installBaseNUMB: Int?
let serialNumber, woStatus: String?
let workOrderNumber: Int?
let woNotes: [String]?
let woParts: [WoPart]?
}
如果 1945206 更改为另一个值,它将中断并且不会显示任何结果。如何在解码数据时使用动态变量?
你可以试试
struct Root : Codable {
let map: [String:The1945206]
}
let res = try? JSONDecoder().decode(Root.self,from:data)
print(res?.map.values)
{
"map": {
"1945204": {
"installBaseNUMB": 0,
"serialNumber": "KB1",
...
},
"1945205": {
"installBaseNUMB": 0,
"serialNumber": "KB1",
...
},
"1945206": {
"installBaseNUMB": 0,
"serialNumber": "KB1",
...
}
}
}
我建议设置与 The1945206
不同的名称,因为它的可读性较差。我将使用 MapElement
代替。如果您知道 map 将只有一个元素,并且不想检查与该值关联的键是什么,则可以使用 computed 属性 var value:MapElement?
来获取它。它 returns 是可选的,因为 let map:[String:MapElement]
字典可以为空。
let json = """
{
"map": {
"1945206": {
"installBaseNUMB": 0,
"serialNumber": "KB1"
}
}
}
""".data(using: .utf8)!
struct Container: Codable {
let map:[String:MapElement]
var value:MapElement? {
return map.values.first
}
}
struct MapElement: Codable {
let installBaseNUMB: Int
let serialNumber: String
}
let res = try? JSONDecoder().decode(Container.self,from:json)
print(res?.value as Any)
更新:
如果你想使用多个 MapElement
,你可以像这样将 var value:MapElement
更改为 var values:[MapElement]
:
struct Container: Codable {
let map:[String:MapElement]
var values:[MapElement] {
return map.values
}
}
但请记住,您将数据存储为字典,因此无法保证元素的顺序。
试试这个:
struct Install: Decodable {
let installBaseNUMB: Int, serialNumber: String
}
let installData = try? JSONDecoder().decode([String:[String:Install]].self, from: jsonData2!)
let install = installData?.values.first?.values.first