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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:45:45