Swift中JSON解析错误排查及数组遍历问题,API调用实现需求
Swift解析API返回的JSON并处理数组问题解决方案
我来帮你搞定Swift里的JSON解析和数组遍历的问题!先把你没写完的GET请求代码补全,再一步步拆解常见的解析错误和数组遍历的正确姿势。
第一步:补全完整的GET请求代码
你之前的代码写到URLSession就断了,先把完整的异步请求流程补好:
func makeGetCall() { // 设置API地址 let todoEndpoint: String = "你的API链接" guard let url = URL(string: todoEndpoint) else { print("Error: 无法创建有效URL") return } let urlRequest = URLRequest(url: url) // 配置并创建会话 let config = URLSessionConfiguration.default let session = URLSession(configuration: config) // 发起数据任务 let task = session.dataTask(with: urlRequest) { data, response, error in // 先处理网络错误 if let error = error { print("网络请求错误: \(error.localizedDescription)") return } // 验证响应状态码(一般200-299是成功) guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { print("响应状态码异常") return } // 处理返回的数据 guard let responseData = data else { print("未获取到返回数据") return } // 这里就是JSON解析的核心环节,后面详细说 self.parseJSON(data: responseData) } // 启动任务 task.resume() }
第二步:定义与JSON结构匹配的Codable模型
这是解析成功的关键!很多解析错误都是因为模型字段和JSON结构不匹配。假设你的API返回的是一个待办事项数组,JSON结构大概是这样:
[
{"id": 1, "title": "买牛奶", "completed": false},
{"id": 2, "title": "写代码", "completed": true}
]
那对应的Swift模型要这么写:
// 单个待办事项模型 struct Todo: Codable { let id: Int let title: String let completed: Bool // 如果JSON里的字段名和Swift变量名不一样,比如JSON里是"todo_title",可以用CodingKeys映射 // enum CodingKeys: String, CodingKey { // case id // case title = "todo_title" // case completed // } }
第三步:实现JSON解析函数
用Swift自带的JSONDecoder来解析,既安全又简单:
func parseJSON(data: Data) { let decoder = JSONDecoder() do { // 如果返回的是数组,就解码成[Todo]类型;如果是单个对象,就解码成Todo let todos = try decoder.decode([Todo].self, from: data) // 解析成功!接下来就可以遍历数组了 self.processTodos(todos: todos) } catch { print("JSON解析失败: \(error.localizedDescription)") // 可以打印具体错误信息,方便排查 print("详细错误: \(error)") } }
第四步:数组遍历与数据使用
解析出数组后,遍历就很简单了,注意要回到主线程更新UI(如果需要的话):
func processTodos(todos: [Todo]) { // 如果要更新UI,必须回到主线程 DispatchQueue.main.async { print("共获取到\(todos.count)条待办事项") // 遍历数组 for todo in todos { print("ID: \(todo.id),标题: \(todo.title),是否完成: \(todo.completed ? "是" : "否")") } // 也可以用forEach简化遍历 todos.forEach { todo in // 在这里处理单个todo数据,比如更新UI列表 } } }
常见解析错误排查指南
如果还是遇到解析错误,大概率是以下原因:
- 字段类型不匹配:比如JSON里是字符串类型的"id",但你模型里定义成了Int,就会报错
- 字段名不匹配:JSON里的字段是"todoTitle",你模型里写的是"title",这时候要加CodingKeys映射
- 可选值未处理:如果JSON里某个字段可能为null,模型里对应的变量要加
?变成可选类型,比如let title: String? - 顶层结构错误:比如你以为返回的是数组,但实际返回的是单个对象(或者反过来),解码的时候类型写错了
内容的提问来源于stack exchange,提问作者Lama
相关产品推荐
相关产品推荐

