You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动