JSON字符串转MobileSettingsModel模型时StatusCode为nil的原因排查
问题原因与解决方案
你的核心问题是:JSONSerialization解析出的是字典/数组这类基础集合类型,无法直接强转为Codable结构体实例。response.toJSON()返回的实际是[String: Any]字典,不是MobileSettingsModel实例,所以as? MobileSettingsModel会返回nil,最终使用了默认初始化的空模型,导致StatusCode为nil。
正确实现方式:用JSONDecoder直接解码字符串到模型
替换现有的toJSON()扩展,改成支持直接解码为指定Codable类型的方法:
extension String { func decodeToModel<T: Codable>() -> T? { guard let data = self.data(using: .utf8) else { return nil } return try? JSONDecoder().decode(T.self, from: data) } }
调用方式调整为:
let settingObject = response.decodeToModel() ?? MobileSettingsModel() "settingObject==\(settingObject)".printLog()
这样就能正确解析出StatusCode: 1的结果。
为什么原方式不行?
JSONSerialization.jsonObject(with:)返回的是Any?,对应JSON的Swift原生类型(字典、数组、字符串等),不是你定义的MobileSettingsModel结构体。Codable协议的映射需要通过JSONDecoder完成,它会自动把JSON数据匹配到结构体的属性上,直接类型转换完全不生效。
补充:若要保留toJSON方法(不推荐)
如果一定要基于现有的字典结果手动映射,需要自己处理属性赋值,这种方式在属性增多时会变得繁琐:
if let jsonDict = response.toJSON() as? [String: Any], let statusCode = jsonDict["StatusCode"] as? Int { let settingObject = MobileSettingsModel(StatusCode: statusCode) "settingObject==\(settingObject)".printLog() } else { let settingObject = MobileSettingsModel() "settingObject==\(settingObject)".printLog() }
内容的提问来源于stack exchange,提问作者Fahim Parkar
相关产品推荐
相关产品推荐

