Swift 4中使用Decodable解析嵌套JSON的疑问
嗨,我来帮你搞定Swift 4里Decodable解析嵌套JSON的问题~
首先我先假设你的JSON结构大概是这样的(如果实际结构有差异,你可以对应调整结构体):
{ "last_payment_amount": 100.5, "last_payment_date": "2024-05-20", "workers": [ { "id": "worker_1", "hashrate": 12345.6, "status": "active" }, { "id": "worker_2", "hashrate": 67890.1, "status": "idle" } ] }
第一步:定义匹配JSON的Decodable结构体
核心思路是:为嵌套的单个worker对象定义子结构体,然后在主结构体里用数组类型接收workers列表。
// 子结构体:对应JSON里的单个worker对象,遵守Decodable协议 struct Worker: Decodable { let id: String let hashrate: Double // 直接对应你要的hashrate字段 let status: String // 如果不需要这个字段,可以删掉 } // 主结构体:包含顶层的支付字段,以及workers数组 struct PaymentData: Decodable { let last_payment_amount: Double let last_payment_date: String let workers: [Worker] // 这里用[Worker]类型接收整个worker列表 }
第二步:解析JSON并获取目标数据
假设你已经拿到了JSON对应的Data对象(比如从网络请求、本地文件读取),可以这样解析:
// 假设jsonData是你获取到的JSON数据 do { let paymentData = try JSONDecoder().decode(PaymentData.self, from: jsonData) // 1. 获取整个worker列表数组 let allWorkers = paymentData.workers print("所有worker信息:\(allWorkers)") // 2. 获取单个worker的hashrate(比如第一个,记得先判断数组非空) if let firstWorkerHashrate = allWorkers.first?.hashrate { print("第一个worker的算力:\(firstWorkerHashrate)") } // 3. 遍历所有worker,逐个获取hashrate for worker in allWorkers { print("Worker \(worker.id) 的算力:\(worker.hashrate)") } } catch { print("JSON解析失败:\(error.localizedDescription)") }
额外优化:字段名映射(符合Swift风格)
如果你的代码习惯用驼峰命名(比如lastPaymentAmount代替last_payment_amount),可以通过CodingKeys枚举做字段映射,让代码更Swift化:
struct PaymentData: Decodable { let lastPaymentAmount: Double let lastPaymentDate: String let workers: [Worker] // 定义CodingKeys来映射JSON字段和Swift属性 enum CodingKeys: String, CodingKey { case lastPaymentAmount = "last_payment_amount" case lastPaymentDate = "last_payment_date" case workers // 字段名一致,不需要额外映射 } } struct Worker: Decodable { let id: String let hashrate: Double let status: String }
这样解析逻辑完全不变,但代码风格更符合Swift的规范~
内容的提问来源于stack exchange,提问作者confusedChris
相关产品推荐
相关产品推荐

