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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:44:51