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

Swift 4使用JSONDecoder解析多层JSON为结构体时结果始终为nil

Swift JSONDecoder解析返回nil的问题排查与解决方法

嘿,作为Swift新手遇到这种解析返回nil的情况确实头疼,我帮你把问题拆解清楚,很快就能搞定!

首先,核心问题出在JSON字段类型和你定义的结构体类型不匹配——JSONDecoder是严格类型安全的,类型不对应就会直接解析失败返回nil,再加上你用try?吞掉了错误信息,导致没法定位问题。咱们一步步来修正:

问题点逐个拆解

  1. isAutoRequest字段类型不匹配:
    服务器返回的是数字类型0,但你在GroupRateModel里定义的是String?,数字没法直接映射成字符串,这是第一个坑。
  2. rateCode和rateName字段类型不匹配:
    看JSON里的rateList数组,rateCode和rateName都是数字(比如1、111),但你在RateList结构体里定义成了String?,类型不匹配直接导致解析失败。
  3. 解析代码隐藏了错误信息:
    你用try?会把所有解析错误直接忽略,换成do-catch就能看到具体哪里出问题,调试起来效率高太多!

修正后的完整代码

1. 匹配JSON类型的结构体

struct GroupRateModel: Codable {
    var isAutoRequest: Int?  // 改成Int,对应JSON的数字类型
    var ruleList: [RuleRateList]?
    var code: String?
    var message: String?
}

struct RuleRateList: Codable {
    var rateList: [RateList]?
    var ruleCode: String?
    var ruleName: String?
    var sort: String?
}

struct RateList: Codable {
    var rate: String?
    var rateCode: Int?  // 改成Int,对应JSON的数字类型
    var rateName: Int?  // 改成Int,对应JSON的数字类型
}

2. 带错误捕获的解析代码

用do-catch替代try?,能直接看到解析失败的具体原因:

let decoder = JSONDecoder()
do {
    let resultData = try JSONSerialization.data(withJSONObject: resultDic, options: [])
    let dataModel = try decoder.decode(GroupRateModel.self, from: resultData)
    print("解析成功:\(dataModel)")
} catch {
    print("解析失败,错误信息:\(error.localizedDescription)")
    // 打印更详细的错误细节,方便定位
    print("详细错误:\(error)")
}

额外调试技巧

以后再遇到解析nil的情况,第一时间用do-catch捕获错误——错误信息会直接告诉你是哪个字段类型不匹配、缺少必填字段等问题,比瞎猜高效多啦!

内容的提问来源于stack exchange,提问作者yohn henry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:55:12