Api 调用返回错误**keyNotFound....**
Api call returning error **keyNotFound....**
我正在尝试进行 api 调用,我正在构建 api 查询并像往常一样解析它,但出现错误:
keyNotFound(CodingKeys(stringValue: "locationType", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription :“没有与键 CodingKeys 关联的值(stringValue:“locationType”,intValue:nil)(“locationType”)。”,underlyingError:nil) **)
获取数据:
func fetchData(completionHandler: @escaping ([Root]) -> Void) {
let queryItems = [URLQueryItem(name: "lat", value: "51.176519"),URLQueryItem(name: "lng", value: "-0.622557"),URLQueryItem(name: "date", value: "2020-11")]
var urlComponents = URLComponents(string: "https://data.police.uk/api/crimes-street/all-crime")
urlComponents?.queryItems = queryItems
guard let combinedUrl = urlComponents?.url else {return}
print(combinedUrl)
let task = URLSession.shared.dataTask(with: combinedUrl,completionHandler : { (data, response, error) in
if let error = error {
print("Error with fetching accounts: \(error)")
return
}
guard let httpResponse = response as? HTTPURLResponse,
(200...400).contains(httpResponse.statusCode) else {
print("Error with the response , unexpected status code:\(response)")
return
}
guard let data = data else {return}
do {
let decoder = JSONDecoder()
let dataSummary = try decoder.decode([Root].self, from: data)
completionHandler(dataSummary.self ?? [])
} catch {
print(error)
}
})
task.resume()
}
ViewController :
override func viewDidLoad() {
super.viewDidLoad()
networking.fetchData{[weak self] (jsonValues) in
self?.jsonValues = jsonValues ;print("JSON values Inside closure : \(jsonValues)")
}
print("JSON values outside closure: \(jsonValues)")
}
根结构:
public struct Root: Codable {
public let category, location_Type: String
public let location: Location
public let context: String
public let outcomeStatus: OutcomeStatus
public let persistentId: String
public let id: Int
public let locationSubtype, month: String
public init(category: String, locationType: String, location: Location, context: String, outcomeStatus: OutcomeStatus, persistentId: String, id: Int, locationSubtype: String, month: String) {
self.category = category
self.locationType = locationType
self.location = location
self.context = context
self.outcomeStatus = outcomeStatus
self.persistentId = persistentId
self.id = id
self.locationSubtype = locationSubtype
self.month = month
}
}
任何帮助都会很棒!
错误表明它在 API 响应中找到了 nil,因为我没有考虑到响应可以是 nil 我已经在 根结构可选,然后它成功解析。
public let category, location_Type: String?
public let location: Location
public let context: String
public let outcomeStatus: OutcomeStatus?
public let persistentId: String?
public let id: Int
public let locationSubtype, month: String?
我正在尝试进行 api 调用,我正在构建 api 查询并像往常一样解析它,但出现错误:
keyNotFound(CodingKeys(stringValue: "locationType", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription :“没有与键 CodingKeys 关联的值(stringValue:“locationType”,intValue:nil)(“locationType”)。”,underlyingError:nil) **)
获取数据:
func fetchData(completionHandler: @escaping ([Root]) -> Void) {
let queryItems = [URLQueryItem(name: "lat", value: "51.176519"),URLQueryItem(name: "lng", value: "-0.622557"),URLQueryItem(name: "date", value: "2020-11")]
var urlComponents = URLComponents(string: "https://data.police.uk/api/crimes-street/all-crime")
urlComponents?.queryItems = queryItems
guard let combinedUrl = urlComponents?.url else {return}
print(combinedUrl)
let task = URLSession.shared.dataTask(with: combinedUrl,completionHandler : { (data, response, error) in
if let error = error {
print("Error with fetching accounts: \(error)")
return
}
guard let httpResponse = response as? HTTPURLResponse,
(200...400).contains(httpResponse.statusCode) else {
print("Error with the response , unexpected status code:\(response)")
return
}
guard let data = data else {return}
do {
let decoder = JSONDecoder()
let dataSummary = try decoder.decode([Root].self, from: data)
completionHandler(dataSummary.self ?? [])
} catch {
print(error)
}
})
task.resume()
}
ViewController :
override func viewDidLoad() {
super.viewDidLoad()
networking.fetchData{[weak self] (jsonValues) in
self?.jsonValues = jsonValues ;print("JSON values Inside closure : \(jsonValues)")
}
print("JSON values outside closure: \(jsonValues)")
}
根结构:
public struct Root: Codable {
public let category, location_Type: String
public let location: Location
public let context: String
public let outcomeStatus: OutcomeStatus
public let persistentId: String
public let id: Int
public let locationSubtype, month: String
public init(category: String, locationType: String, location: Location, context: String, outcomeStatus: OutcomeStatus, persistentId: String, id: Int, locationSubtype: String, month: String) {
self.category = category
self.locationType = locationType
self.location = location
self.context = context
self.outcomeStatus = outcomeStatus
self.persistentId = persistentId
self.id = id
self.locationSubtype = locationSubtype
self.month = month
}
}
任何帮助都会很棒!
错误表明它在 API 响应中找到了 nil,因为我没有考虑到响应可以是 nil 我已经在 根结构可选,然后它成功解析。
public let category, location_Type: String?
public let location: Location
public let context: String
public let outcomeStatus: OutcomeStatus?
public let persistentId: String?
public let id: Int
public let locationSubtype, month: String?