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
相关产品推荐
相关产品推荐

