EDITED
您好我第一次使用可编码协议:我的JSON响应(使用POSTMAN)是:
[
{
"FltId": "928",
"Carrier": "AS",
"Orig": "ANC",
"Dest": "SEA",
"CutOffTime": "40",
"FltDirection": 0,
"SchedDepTime": "2018-03-21T01:25:00",
"EstDepTime": "2018-03-21T01:25:00",
"SchedArrTime": "2018-03-21T05:43:00",
"EstArrTime": "2018-03-21T05:43:00",
"ActualTime": "",
"OrigZuluOffset": "-8",
"DestZuluOffset": "-7",
"DestGate": "C15",
"OrigGate": "",
"CodeShares": [
{
"FltId": "",
"Carrier": ""
}
],
"TailId": "251",
"FleetType": "737-900R",
"Status": "ON TIME"
},
{
"FltId": "3422",
"Carrier": "OO",
"Orig": "BLI",
"Dest": "SEA",
"CutOffTime": "40",
"FltDirection": 0,
"SchedDepTime": "2018-03-21T05:00:00",
"EstDepTime": "2018-03-21T05:00:00",
"SchedArrTime": "2018-03-21T05:56:00",
"EstArrTime": "2018-03-21T05:56:00",
"ActualTime": "",
"OrigZuluOffset": "-7",
"DestZuluOffset": "-7",
"DestGate": "C16",
"OrigGate": "",
"CodeShares": [
{
"FltId": "",
"Carrier": ""
}
],
"TailId": "417",
"FleetType": "CRJ-200",
"Status": "ON TIME"
}]
我在swift代码中创建了一个可编码的对象结构,并想知道它是否正确:
struct Response: Codable {
let flights: [Flight]
}
struct Flight: Codable{
let FltId, Carrier, Orig, Dest, CutOffTime, FltDirection, SchedDepTime, EstDepTime, SchedArrTime, EstArrTime, ActualTime, OrigZuluOffset, DestZuluOffset, DestGate, OrigGate, TailId, FleetType, Status: String, CodeShares:[CodeShare]
}
struct CodeShare: Codable {
let FltId, Carrier: String
}
这可以进一步修复或改进吗?什么是编码键?我得到了这个奇怪的错误:
失败(Swift.DecodingError.keyNotFound(table_view_api.FlightWebService.Response。(CodingKeys in _954486EAAC5BB7DDCEFC26E493D69F38).flights,Swift.DecodingError.Context(codingPath:[Foundation。(_ JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue:&#34 ;索引0",intValue:可选(0))],debugDescription:"没有与关键航班相关的值(\"航班\")。",underlyingError:nil ))))
我错过了什么吗?
此外,我正在使用正确的身份验证标头提出我的Web服务请求,如:
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("Basic YWFnZTQxNDAxMjgwODYyNDk3NWFiYWNhZjlhNjZjMDRlMWY6ODYyYTk0NTFhYjliNGY1M2EwZWJiOWI2ZWQ1ZjYwOGM=", forHTTPHeaderField: "Authorization")
func getFlightData(for airportCode: String, minutesBehind:String, minutesAhead:String, completion: ((Result<[Response]>) -> Void)?) {
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "api.qa.alaskaair.com"
urlComponents.path = "/1/airports/"+airportCode+"/flights/flightInfo"
urlComponents.queryItems = [
URLQueryItem(name: "city", value: airportCode),
URLQueryItem(name: "minutesBehind", value: minutesBehind),
URLQueryItem(name: "minutesAhead", value: minutesAhead)
]
guard let url = urlComponents.url else { fatalError("Could not create URL from components") }
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("Basic YWFnZTQxNDAxMjgwODYyNDk3NWFiYWNhZjlhNjZjMDRlMWY6ODYyYTk0NTFhYjliNGY1M2EwZWJiOWI2ZWQ1ZjYwOGM=", forHTTPHeaderField: "Authorization")
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
let task = session.dataTask(with: request) { (responseData, response, responseError) in
DispatchQueue.main.async {
if let error = responseError {
completion?(.failure(error))
} else if let jsonData = responseData {
let decoder = JSONDecoder()
do {
let posts = try decoder.decode(Array<Flight>.self, from: jsonData)
completion?(.success(posts))
} catch {
completion?(.failure(error))
}
} else {
let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey : "Data was not retrieved from request"]) as Error
completion?(.failure(error))
}
}
}
task.resume()
}
这可能有问题吗?
答案 0 :(得分:1)
听起来您正在尝试将JSON解码为响应。那是你的错。鉴于您已定义的结构和您显示的JSON,您的JSON显然是(或意图是)一个Flight数组,也就是说Array<Flight>.self
。这就是你需要解码的内容。
你的Response结构实际上显然与JSON无关;您无法解码为响应,因为JSON不是具有键"flights"
的字典。您可以手动创建响应 并将其flights
手动设置为该结果,但是您的Response结构虽然可以派上用场,但没有任何内容。用你的JSON做。