Swift解析历史上的今天API出现JSON解码错误问题求解
解决方案
1. 修改数据解析模型
你当前的模型错误地将data字段定义为数组,实际该API返回的data是字典结构,内部包含Events、Births、Deaths三个分类的事件数组,修改模型如下:
// 最外层响应结构 struct HistoryAPIResponse: Codable { let data: DataClass } // data字段对应的字典结构 struct DataClass: Codable { let events: [Event] // 若需要获取出生、逝世相关数据可放开下面两个注释 // let births: [Event] // let deaths: [Event] } // 单条事件模型 struct Event: Codable { let year: String let text: String let html: String // 若需要解析事件关联链接可放开以下注释 // let links: [Link] } // 可选:关联链接结构 // struct Link: Codable { // let title: String // let link: String // }
2. 修改请求方法的解析逻辑
原有代码解析完成后没有取值、也没有触发成功回调,补充逻辑如下(以getTopStories为例):
public func getTopStories(completion: @escaping (Result<[Event], Error>) -> Void) { guard let url = Constants.topHeadLinesURL else { return } let task = URLSession.shared.dataTask(with: url) { data, _, error in if let error = error { completion(.failure(error)) } else if let data = data { do { let response = try JSONDecoder().decode(HistoryAPIResponse.self, from: data) // 取出事件数组作为成功结果返回 completion(.success(response.data.events)) } catch { completion(.failure(error)) } } } task.resume() }
search方法按相同逻辑修改即可。
额外注意事项
- 原API的日期路径格式为
/date/月/日,你的搜索逻辑如果是按日期查询,不要直接在现有/date/4/19后面拼接参数,需要替换路径里的月、日部分,避免生成非法请求URL - iOS默认禁止HTTP请求,你需要在Info.plist中添加App Transport Security Settings例外,允许该HTTP域名的请求,否则会直接触发请求失败
内容的提问来源于stack exchange,提问作者Richard Whatever
相关产品推荐
相关产品推荐

