Swift中JSON解析为模型对象的实现及相关咨询
在Swift中解析JSON为GradingData模型对象
嘿,看起来你已经搞定了测试数据的模型实例,现在要实现JSON到模型的解析对吧?在Swift里最省心高效的方式就是用Codable协议,我给你一步步讲清楚怎么弄:
第一步:让你的GradingData模型遵循Codable协议
首先要确保你的GradingData结构体(或者类)实现Codable协议——Swift会自动为所有属性都是Codable类型的结构体合成协议方法,不用你手动写编码解码逻辑。比如:
struct GradingData: Codable { let lot: String let andColumns: String let SLAIssuedFinalGrading: Bool let SLAIssuedFinalGradingDate: String let CityApprovalIssued: Bool let CityCommentReceived: Bool let GradingRepair: String let CurbStopRepair: String let SplashPadDownSpout: String let RYCBOtherRepairs: String let Comments: String let columnCamera: String // 记得把你原来方法里的DepositRecei...这类未补全的属性也加进来哦 }
如果JSON里的键名和你模型的属性名不一致(比如JSON里是小驼峰slaIssuedFinalGrading,而你模型是大驼峰开头),那你需要手动定义CodingKeys枚举来做映射:
extension GradingData { enum CodingKeys: String, CodingKey { case lot case andColumns case SLAIssuedFinalGrading = "slaIssuedFinalGrading" // 其他属性如果需要映射也在这里添加 } }
第二步:编写JSON解析函数
接下来写一个通用的解析函数,把JSON的Data类型转换成你的模型对象(或者模型数组):
解析单个模型对象
func parseSingleGradingData(from jsonData: Data) -> GradingData? { let decoder = JSONDecoder() // 如果你模型里的日期是Date类型,而JSON里是字符串格式,需要设置日期解码策略 // 比如自定义日期格式: // let dateFormatter = DateFormatter() // dateFormatter.dateFormat = "yyyy-MM-dd" // decoder.dateDecodingStrategy = .formatted(dateFormatter) do { let gradingData = try decoder.decode(GradingData.self, from: jsonData) return gradingData } catch { print("解析出错啦:\(error.localizedDescription)") // 也可以打印详细错误信息排查问题:print(error) return nil } }
解析模型数组(对应你测试方法返回的数组类型)
如果你的JSON是数组格式,就用这个版本:
func parseGradingDataArray(from jsonData: Data) -> [GradingData]? { let decoder = JSONDecoder() do { let gradingDataArray = try decoder.decode([GradingData].self, from: jsonData) return gradingDataArray } catch { print("数组解析出错:\(error.localizedDescription)") return nil } }
第三步:实际使用示例
比如你有一个JSON字符串,先转成Data再传入解析函数:
// 示例JSON字符串(和你的模型属性对应) let sampleJsonString = """ [ { "lot": "lot123", "andColumns": "col456", "SLAIssuedFinalGrading": true, "SLAIssuedFinalGradingDate": "2024-05-20", "CityApprovalIssued": true, "CityCommentReceived": false, "GradingRepair": "completed", "CurbStopRepair": "pending", "SplashPadDownSpout": "none", "RYCBOtherRepairs": "none", "Comments": "all checks passed", "columnCamera": "" } ] """ // 把字符串转成Data if let jsonData = sampleJsonString.data(using: .utf8) { // 解析数组 if let gradingDataArray = parseGradingDataArray(from: jsonData) { print("解析成功!第一个数据的lot是:\(gradingDataArray[0].lot)") } }
一些额外注意点
- 如果JSON里的某些字段是可选的(可能不存在),记得把模型里对应的属性设为可选类型,比如
let lot: String? - 如果模型里有嵌套的自定义对象,那嵌套的对象也需要遵循
Codable协议 - 从网络请求获取JSON时,直接把请求返回的
Data传入解析函数即可,不用额外转换
内容的提问来源于stack exchange,提问作者user979331
相关产品推荐
相关产品推荐

