iOS Swift中如何解析包含字典数组的JSON?附请求示例代码
在iOS Swift中解析含字典数组的JSON(结合Alamofire)
首先,你的现有代码里直接把response结果强制转成NSArray其实风险很高——如果接口返回格式不符合预期,直接就崩溃了。更推荐用Swift原生的Codable协议来做类型安全的解析,下面是具体的实现步骤:
1. 定义对应的数据模型
先根据你接口返回的JSON结构,创建一个遵循Codable的结构体。比如假设你的JSON数组里每个字典是这样的:
[ { "id": 1, "name": "张三", "title": "资深工程师" }, { "id": 2, "name": "李四", "title": "设计师" } ]
那对应的Swift模型就可以这么写:
// 模型属性要和JSON字段一一对应,字段名不一致可以用CodingKeys映射 struct Professional: Codable { let id: Int let name: String let title: String // 如果JSON键和Swift属性名不同,比如JSON里是"job_title",就加这个枚举 // enum CodingKeys: String, CodingKey { // case id, name // case title = "job_title" // } }
2. 优化Alamofire请求的解析逻辑
Alamofire自带了responseDecodable方法,可以直接把返回的数据解析成我们定义好的模型数组,比手动处理responseJSON更简洁安全。修改后的代码如下:
// 先在类里定义数据源数组 var professionals: [Professional] = [] func fetchProfessionalData() { guard let url = URL(string: "urlString") else { print("URL无效") return } let parameters = ["Address": ""] as [String: Any] Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil) .responseDecodable(of: [Professional].self) { response in switch response.result { case .success(let fetchedProfessionals): // 拿到解析好的数组,赋值给数据源 self.professionals = fetchedProfessionals print("解析成功:\(fetchedProfessionals)") // 必须在主线程刷新UI!网络请求是后台线程执行的 DispatchQueue.main.async { self.listTableView.reloadData() } case .failure(let error): print("请求或解析出错:\(error.localizedDescription)") } } }
3. 手动解析的替代方案(如果不想用responseDecodable)
如果你更习惯手动处理数据,也可以用responseData拿到原始数据后,自己用JSONDecoder解析:
func fetchProfessionalData() { guard let url = URL(string: "urlString") else { return } let parameters = ["Address": ""] as [String: Any] Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil) .responseData { response in switch response.result { case .success(let data): do { let professionals = try JSONDecoder().decode([Professional].self, from: data) self.professionals = professionals DispatchQueue.main.async { self.listTableView.reloadData() } } catch let decodeError { print("JSON解析失败:\(decodeError.localizedDescription)") } case .failure(let error): print("网络请求失败:\(error.localizedDescription)") } } }
几个关键注意点
- 类型安全:用
Codable避免了强制类型转换的崩溃风险,编译器会帮你检查模型和JSON的匹配度 - 主线程刷新UI:网络请求的回调是在后台线程的,必须切换到主线程更新tableView,否则会出现UI异常
- 字段匹配:模型的属性名要和JSON的键完全一致,不一致就用
CodingKeys做映射
内容的提问来源于stack exchange,提问作者Venkatesh Chejarla




