You need to enable JavaScript to run this app. Swift开发中如何从服务端JSON数据提取指定字段值构建新数组
优惠活动
大模型
产品
解决方案
定价
更多

Swift开发中如何从服务端JSON数据提取指定字段值构建新数组

需求实现方案

基于你现有JSONSerialization代码的快速实现

你当前的JSON结构分层非常清晰:顶层字典包含vendors键,对应值是vendor信息组成的数组,数组中每个元素是包含firm字段的单条vendor字典。只需要按层级取值、遍历收集即可得到目标数组,完整可运行代码如下:

do {
    // 逐层校验JSON结构,避免强制拆包导致的崩溃
    guard let jsonDict = try JSONSerialization.jsonObject(with: data!, options: []) as? [String: Any],
          let vendorList = jsonDict["vendors"] as? [[String: Any]] else {
        print("JSON结构和预期不匹配")
        return
    }
    // 遍历数组,提取firm字段的字符串值,自动过滤无效条目
    let firms = vendorList.compactMap { $0["firm"] as? String }
    // 输出结果为:["XXX firm", "ZZZZZ firm"]
    print(firms)
} catch {
    print("JSON解析出错:\(error.localizedDescription)")
}

实现说明

  • 原代码中使用的.mutableContainers解析选项在当前Swift版本中对解析结果没有实质影响,替换为空数组选项即可,不会改变输出。
  • 这里使用compactMap做映射,是为了自动跳过firm字段缺失、或者字段类型不是字符串的异常条目,比强制类型转换更稳定,不会因为服务端返回的异常值触发崩溃。
  • 从你提供的服务端原始JSON来看,id、show_firm字段实际返回的是字符串类型而非数字,但因为我们只提取firm字段的字符串值,完全不会影响最终结果。
  • 原代码中使用as? NSDictionary的OC兼容写法对Swift类型系统适配性较弱,替换为Swift原生的[String: Any]字典类型后,取值时的类型校验会更顺畅。

长期可维护的优化写法

如果后续需要维护更多字段的解析逻辑,建议直接使用Swift原生的Codable能力,不需要手动逐层拆字典、校验类型,系统会自动完成结构匹配和类型校验:

// 定义和JSON结构完全匹配的模型
struct VendorInfo: Codable {
    let firm: String
    let id: String
    let show_firm: String
}
struct ResponseModel: Codable {
    let vendors: [VendorInfo]
}
// 解析逻辑
do {
    let parsedData = try JSONDecoder().decode(ResponseModel.self, from: data!)
    let firms = parsedData.vendors.map { $0.firm }
    print(firms)
} catch {
    print("解析失败:\(error.localizedDescription)")
}

内容的提问来源于stack exchange,提问作者Ergün Gülbiten

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 19:36:05