Swift 4 Codable仅解码JSON中employees数组并保存time的问题求助
解决Swift 4 Codable解码指定数组及单独字段的问题
嘿,我正好碰到过类似的需求,用Swift 4的Codable完全能搞定!你要的是提取JSON里的employees数组到Employee对象,同时单独保存time属性对吧?给你两种实用的方案:
方案一:创建匹配JSON结构的顶层模型(推荐)
这种方式最符合Codable的设计思路,简单直观,后续维护也方便。首先先补全你的Employee结构,然后创建对应JSON层级的模型:
定义模型结构
import Foundation struct Employee: Codable { var id: Int var name: String } // 匹配JSON顶层结构的模型 struct ApiResponse: Codable { let status: String let data: ResponseData } // 匹配JSON中data字段的模型 struct ResponseData: Codable { let time: String let employees: [Employee] }
解码代码实现
// 假设你已经从Web服务拿到了JSON数据(Data类型) let jsonData: Data = ... // 你的JSON数据 do { // 解码整个响应 let response = try JSONDecoder().decode(ApiResponse.self, from: jsonData) // 提取你需要的内容 let targetEmployees = response.data.employees let targetTime = response.data.time // 接下来就可以使用这两个变量做业务处理了 print("获取到时间:\(targetTime)") print("员工列表:\(targetEmployees)") } catch { print("解码失败,错误信息:\(error.localizedDescription)") }
这种方案的好处是:如果后续JSON新增字段,只需要在对应模型里添加属性即可,无需修改解码逻辑,类型安全也有保障。
方案二:直接解析JSON字典(适合仅需少量字段的场景)
如果你不想创建额外的模型类,可以直接把JSON转成字典,逐层提取需要的字段,再单独解码employees数组:
import Foundation let jsonData: Data = ... // 你的JSON数据 do { // 将JSON数据转成字典 guard let jsonDict = try JSONSerialization.jsonObject(with: jsonData) as? [String: Any], let dataDict = jsonDict["data"] as? [String: Any], // 提取time字段 let targetTime = dataDict["time"] as? String, // 把employees数组转成Data,再解码成[Employee] let employeesRaw = dataDict["employees"] as? [[String: Any]], let employeesData = try? JSONSerialization.data(withJSONObject: employeesRaw), let targetEmployees = try? JSONDecoder().decode([Employee].self, from: employeesData) else { print("JSON格式不匹配或字段缺失") return } // 成功获取到需要的内容 print("时间:\(targetTime)") print("员工:\(targetEmployees)") } catch { print("处理失败:\(error)") }
这种方式省去了模型类的创建,但需要手动处理类型转换,一旦JSON结构变动,就得修改字典的取值路径,适合只需要提取少数字段的场景。
注意点
- JSON里的
id是001这种数字,Swift的Int类型会自动解析为1,完全没问题;如果后端返回的是字符串类型的ID,记得把Employee的id类型改成String。 - 解码时一定要处理
do-catch,避免因为JSON格式错误导致崩溃。
内容的提问来源于stack exchange,提问作者chr0x
相关产品推荐
相关产品推荐

