Swift 3:如何在解析后的JSON响应字典中添加键值对
当然可以在解析过程中直接给每个字典添加新的键值对啦!下面我给你两种适配Swift 3的实现方案,你可以根据自己的代码结构来选择:
方案一:直接修改解析后的字典数组
如果你的代码是直接将JSON解析成[[String: Any]]类型的字典数组,那可以在解析完成后立刻遍历数组,给每个字典添加address字段。注意Swift里的字典是值类型,需要先复制原字典再修改,不然无法直接修改数组里的元素:
// 假设你已经通过URL请求获取到了响应数据data do { // 将Data解析为字典数组 guard var jsonArray = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] else { print("JSON格式不符合预期,无法解析为字典数组") return } // 遍历数组,为每个字典添加address字段 for index in 0..<jsonArray.count { var currentDict = jsonArray[index] // 这里替换成你实际需要设置的address值,也可以根据字典现有字段动态生成 currentDict["address"] = "北京市朝阳区某某街道" jsonArray[index] = currentDict } // 此时jsonArray已经是添加了新字段的数组,可继续后续业务逻辑 print("处理后的JSON数组:\(jsonArray)") } catch { print("JSON解析出错:\(error.localizedDescription)") }
方案二:解析为自定义模型时添加字段
如果你的项目习惯把JSON解析成自定义模型对象,那可以在模型的初始化方法里直接加入address字段的赋值逻辑,这样解析后每个模型对象都会自带这个属性:
首先定义你的自定义模型:
struct User { var username: String var email: String var address: String? // 新增的address字段 // 从字典初始化模型 init?(dict: [String: Any]) { // 先解析原有字段 guard let username = dict["username"] as? String, let email = dict["email"] as? String else { return nil } self.username = username self.email = email // 在这里设置address的值,可以是固定值,也可以根据其他字段动态生成 self.address = "\(username)的默认地址" } }
然后进行解析:
do { guard let jsonArray = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] else { print("JSON格式错误") return } // 将字典数组解析为模型数组,自动带上address字段 let userList = jsonArray.compactMap { User(dict: $0) } // 现在userList里的每个User对象都包含address属性了 for user in userList { print("\(user.username) 的地址:\(user.address ?? "未设置")") } } catch { print("解析失败:\(error)") }
补充说明
如果你的address值需要根据每个字典里的其他字段动态计算(比如用city和street拼接成完整地址),只需要在遍历或模型初始化时,从原字典中取出对应字段进行处理即可,比如:
// 动态生成address示例 if let city = currentDict["city"] as? String, let street = currentDict["street"] as? String { currentDict["address"] = "\(city)\(street)" } else { currentDict["address"] = "地址未知" }
内容的提问来源于stack exchange,提问作者Kanav Batra
相关产品推荐
相关产品推荐

