iOS Swift 如何解析JSON数组并逐个追加元素到模型对象数组
手动逐元素解析JSON数组构造Quote实例方案
你当前的实现是直接将接口返回数据整体解码为[Quote]数组后整体赋值,若需要逐个解析数组项、手动构造实例追加到数组,可按如下方式实现:
原有实现代码
do{ let (responseString, _) = try await URLSession.shared.data(for: request) if let decodedResponse = try? JSONDecoder().decode([Quote].self, from: responseString){ quotes = decodedResponse } }catch{ print("data not valid") }
提示:
URLSession.shared.data(for:)返回的第一个参数是Data类型,并非字符串类型,变量命名为responseString存在语义偏差,建议调整为responseData避免误解。
具体实现逻辑
核心思路是先将返回数据解析为顶层为数组的JSON结构,遍历数组中每个JSON对象,手动提取字段值后初始化Quote实例:
- 第一步:将接口返回的
Data通过JSONSerialization转换为[[String: Any]]类型的数组,数组中每个元素对应一个JSON对象 - 第二步:遍历数组,对每个元素字典做字段提取和类型校验
- 第三步:校验通过的字段传入
Quote构造方法,将生成的实例追加到quotes数组
完整实现代码
do { let (responseData, _) = try await URLSession.shared.data(for: request) // 校验返回数据是否为合法JSON数组 guard let jsonArray = try JSONSerialization.jsonObject(with: responseData) as? [[String: Any]] else { print("返回数据格式不符合预期,不是JSON数组") return } // 逐元素解析 for item in jsonArray { // 按字段名取值,做类型匹配,根据你实际接口的字段类型调整判断逻辑 guard let id = item["quote_id"] as? Int, let quoteText = item["quote"] as? String, let author = item["author"] as? String, let series = item["series"] as? String else { // 单条数据字段缺失或类型不匹配时直接跳过,不影响其他正常数据解析 continue } quotes.append(Quote(quote_id: id, quote: quoteText, author: author, series: series)) } } catch { print("数据请求或解析失败:\(error.localizedDescription)") }
方案优势
- 容错性高:单条数据格式错误不会导致整批数据解析失败,仅跳过异常项即可
- 灵活性强:字段提取过程中可以直接做自定义转换逻辑,比如特殊格式处理、默认值赋值、字段映射等,不需要额外编写
Codable的自定义编码/解码方法
内容的提问来源于stack exchange,提问作者user10651308
相关产品推荐
相关产品推荐

