You need to enable JavaScript to run this app. Swift解析历史上的今天API出现JSON解码错误问题求解
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 06:36:05