Swift 4使用JSONDecoder解析多层JSON为结构体时结果始终为nil
Swift JSONDecoder解析返回nil的问题排查与解决方法
嘿,作为Swift新手遇到这种解析返回nil的情况确实头疼,我帮你把问题拆解清楚,很快就能搞定!
首先,核心问题出在JSON字段类型和你定义的结构体类型不匹配——JSONDecoder是严格类型安全的,类型不对应就会直接解析失败返回nil,再加上你用try?吞掉了错误信息,导致没法定位问题。咱们一步步来修正:
问题点逐个拆解
isAutoRequest字段类型不匹配:
服务器返回的是数字类型0,但你在GroupRateModel里定义的是String?,数字没法直接映射成字符串,这是第一个坑。rateCode和rateName字段类型不匹配:
看JSON里的rateList数组,rateCode和rateName都是数字(比如1、111),但你在RateList结构体里定义成了String?,类型不匹配直接导致解析失败。- 解析代码隐藏了错误信息:
你用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
相关产品推荐
相关产品推荐

