You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:10:32