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

Swift中如何添加字典类型JSON并正确获取其返回的数值?

问题分析

  • 第一种JSONDecoder解析方案的错误:
    你使用的JSON结构中result数组下data数组内的对象仅包含Diastolic、Systolic、Pulse、ErrorCode四个字段,你尝试读取的Temperature、Mode、Unit三个字段完全不存在,可选绑定自然会失败,进入else分支。同时请确认你的VitalSignTermometreResponse、对应Result模型、Data模型的字段名、类型和JSON完全匹配(包括大小写),否则JSONDecoder也会解析失败返回nil。
  • 第二种手动字典取值方案的错误:
  1. 原始JSON中result是数组类型,你构造的responseDevice字典里result直接是字典类型,结构和源JSON不一致
  2. 你尝试把数值为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:06:02