Ios 如何将具有变量名的JSON转换为swift对象?
我正在处理一个带有API的项目,API给我一个JSON对象,其中包含一些变量中的数据。但用于提供数据的变量的名称每天都在变化。比如今天的名字是285,明天是286。如何将其转换为Swift对象?我已经写了一些代码,所以这里是: 获取数据部分:Ios 如何将具有变量名的JSON转换为swift对象?,ios,json,swift,macos,Ios,Json,Swift,Macos,我正在处理一个带有API的项目,API给我一个JSON对象,其中包含一些变量中的数据。但用于提供数据的变量的名称每天都在变化。比如今天的名字是285,明天是286。如何将其转换为Swift对象?我已经写了一些代码,所以这里是: 获取数据部分: func getData(){ let semaphore = DispatchSemaphore.init(value: 0) let url = URL(string: URL_STRING)! var
func getData(){
let semaphore = DispatchSemaphore.init(value: 0)
let url = URL(string: URL_STRING)!
var request = URLRequest(url: url)
request.httpMethod = "GET"
session.dataTask(with: request) { (dat, res, err) in
print("Anfrage gestellt")
guard let data = dat else {
print("no Data")
return
}
guard let resp = res else {
print("No Response ")
return
}
if let error = err {
print("Error: \(error)")
return
}
do{
let decodedData = try self.decoder.decode(Report.self, from: data)
print(decodedData)
} catch {
print("Data decode failed \(error)")
}
semaphore.signal()
}.resume()
semaphore.wait()
return
}
将在其中进行转换的对象
class Report: Codable{
var keys: [String] = []
var latest: String?
let s: S
init(keys: [String], s: S){
self.keys = keys
self.s = s
latest = keys[keys.count - 1]
}
enum CodingKeys: String, CodingKey{
case s = "286"
}
}
JSON对象:
{
"285": {
"AT": {
"av": -72.1,
"ct": 113986,
"mn": -100.813,
"mx": -27.115
},
"First_UTC": "2019-09-15T01:13:15Z",
"HWS": {
"av": 4.347,
"ct": 54297,
"mn": 0.20600000000000002,
"mx": 21.272
},
"Last_UTC": "2019-09-16T01:52:49Z",
"PRE": {
"av": 742.003,
"ct": 89613,
"mn": 723.2129,
"mx": 757.8722
},
"Season": "spring",
"WD": {
"1": {
"compass_degrees": 22.5,
"compass_point": "NNE",
"compass_right": 0.382683432365,
"compass_up": 0.923879532511,
"ct": 1
},
"10": {
"compass_degrees": 225.0,
"compass_point": "SW",
"compass_right": -0.707106781187,
"compass_up": -0.707106781187,
"ct": 6973
},
"11": {
"compass_degrees": 247.5,
"compass_point": "WSW",
"compass_right": -0.923879532511,
"compass_up": -0.382683432365,
"ct": 3196
},
"12": {
"compass_degrees": 270.0,
"compass_point": "W",
"compass_right": -1.0,
"compass_up": -0.0,
"ct": 3066
},
"3": {
"compass_degrees": 67.5,
"compass_point": "ENE",
"compass_right": 0.923879532511,
"compass_up": 0.382683432365,
"ct": 131
},
"5": {
"compass_degrees": 112.5,
"compass_point": "ESE",
"compass_right": 0.923879532511,
"compass_up": -0.382683432365,
"ct": 680
},
"6": {
"compass_degrees": 135.0,
"compass_point": "SE",
"compass_right": 0.707106781187,
"compass_up": -0.707106781187,
"ct": 9405
},
"7": {
"compass_degrees": 157.5,
"compass_point": "SSE",
"compass_right": 0.382683432365,
"compass_up": -0.923879532511,
"ct": 8813
},
"8": {
"compass_degrees": 180.0,
"compass_point": "S",
"compass_right": 0.0,
"compass_up": -1.0,
"ct": 8231
},
"9": {
"compass_degrees": 202.5,
"compass_point": "SSW",
"compass_right": -0.382683432365,
"compass_up": -0.923879532511,
"ct": 13801
},
"most_common": {
"compass_degrees": 202.5,
"compass_point": "SSW",
"compass_right": -0.382683432365,
"compass_up": -0.923879532511,
"ct": 13801
}
}
},
"sol_keys": [
"285"
]
}
谢谢你的帮助
Eric如前所述,您可以将其解码为字典,首先为要解码的数据定义一个结构
struct ReportData: Decodable {
let at: SomeData
let firstUTC: Date
let hws: SomeData
//...
}
然后将其解码为
let decodedData = try self.decoder.decode([String:ReportData].self, from: data)
要在字典中找到正确的键,您可以使用sol_键
if let keys = decodedData ["sol_keys"] {
for key in keys {
let report = decodeData[key]
//...
显示JSON。不要使用信号量。在这种情况下,你使用
字典@user28434,这是什么意思?创建一个以“286”为键,以“s”为数据的字典?我想这不会解决我的问题,因为仍然需要硬编码中的“286”:/What?如何“将密钥硬编码到字典中”
?您只需将JSON
解析为[String:][/code>“sol_keys”似乎包含要使用的密钥非常感谢!!您是一位英雄!