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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:41:51