Swift中如何添加字典类型JSON并正确获取其返回的数值?
问题分析
- 第一种JSONDecoder解析方案的错误:
你使用的JSON结构中result数组下data数组内的对象仅包含Diastolic、Systolic、Pulse、ErrorCode四个字段,你尝试读取的Temperature、Mode、Unit三个字段完全不存在,可选绑定自然会失败,进入else分支。同时请确认你的VitalSignTermometreResponse、对应Result模型、Data模型的字段名、类型和JSON完全匹配(包括大小写),否则JSONDecoder也会解析失败返回nil。 - 第二种手动字典取值方案的错误:
- 原始JSON中
result是数组类型,你构造的responseDevice字典里result直接是字典类型,结构和源JSON不一致 - 你尝试把数值为Int类型的
Diastolic、Systolic强转成String,类型不匹配,绑定失败自然没有输出
修正方案
1. JSONDecoder方案修正
首先确保模型定义和JSON完全匹配,示例模型定义如下:
// 根模型 struct VitalSignResponse: Codable { let result: [ResultItem] let error: Int let flags: Int } // Result数组元素模型 struct ResultItem: Codable { let id_d: Int let id_c: String let data: [DataItem] let date_s: String } // Data数组元素模型 struct DataItem: Codable { let Diastolic: Int let ErrorCode: Int let Systolic: Int let Pulse: Int }
再修改解析取值逻辑,调试阶段建议用do-catch捕获错误排查问题,不要直接用try?吞掉报错:
let jsonLifevitPBM_200 = """ { "result" : [ { "id_d" : 55, "id_c" : "0", "data" : [ { "Diastolic" : 85, "ErrorCode" : -1, "Systolic" : 120, "Pulse" : 72 } ], "date_s" : "2021-07-28 09:45:16.201" } ], "error" : 0, "flags" : 0 } """ let jsonKelvin = Data(jsonLifevitPBM_200.utf8) do { let jsonKelvinResult = try JSONDecoder().decode(VitalSignResponse.self, from: jsonKelvin) guard let firstResult = jsonKelvinResult.result.first, let firstData = firstResult.data.first else { labelResult.text = "返回数据为空" return } // 读取存在的字段赋值 labelsystole.text = "\(firstData.Systolic)" labeldiastole.text = "\(firstData.Diastolic)" labelPulse.text = "\(firstData.Pulse)" } catch { print("解析错误:\(error)") labelResult.text = "Error Medisana BU 575 Connect" }
2. 手动字典取值方案修正
先修正字典结构匹配JSON,再调整类型转换逻辑:
// 修正result为数组类型,和JSON结构一致 let responseDevice : [String : Any] = [ "result" : [ [ "id_d" : 55, "id_c" : "0", "data" : [ [ "Diastolic" : 85, "ErrorCode" : -1, "Systolic" : 120, "Pulse" : 72 ] ], "date_s" : "2021-07-28 09:45:16.201" ] ] ] if let resultArr = responseDevice["result"] as? [[String : Any]], let firstResult = resultArr.first, let dataArr = firstResult["data"] as? [[String : Any]], let firstData = dataArr.first, let diast = firstData["Diastolic"] as? Int, let systolic = firstData["Systolic"] as? Int { print("Result : \(diast) - \(systolic)") }
内容的提问来源于stack exchange,提问作者José Leoncio Quispe Rodriguez
相关产品推荐
相关产品推荐

