Swift 4中.decode方法返回值解析及JSON空值崩溃问题咨询
关于Swift 4中JSONDecoder.decode()的返回值与空值解析崩溃问题
一、decode()方法具体返回什么?
其实官方文档说的“内存中的表示形式”就是你定义的结构体/类的实例。举个例子,如果你定义了一个遵循Codable协议的User结构体,当你调用try JSONDecoder().decode(User.self, from: jsonData)时,方法会把传入的JSON数据(Data类型)转换成一个User类型的对象——这个对象就存在内存里,你可以直接访问它的属性来使用解析后的数据。
简单说,它就是把JSON里的键值对映射到你结构体的对应属性,最终给你一个可以直接操作的实例,而不是原始的JSON字符串或者Data数据。
二、解析空值时崩溃的解决方法
你的应用崩溃,大概率是因为结构体里的某些属性是非可选类型,但返回的JSON中对应字段是null或者干脆不存在——JSONDecoder没办法把nil赋值给非可选属性,就会抛出错误导致崩溃。这里有两种常用的解决思路:
1. 将可能为空的属性改为可选类型
这是最简单的方法,把结构体中可能出现空值的属性类型后面加个?,让它变成可选类型。比如:
// 原来的结构体(遇到空值会崩溃) struct User: Codable { let id: Int let name: String let email: String // JSON中email可能为null } // 修改后(空值时会被设为nil,避免崩溃) struct User: Codable { let id: Int let name: String let email: String? }
2. 给空值字段设置默认值(不用可选类型)
如果你不想用可选类型,希望属性始终有值,可以通过自定义解码逻辑来给空值设置默认值。比如:
struct User: Codable { let id: Int let name: String let email: String // 保持非可选,空值时用默认空字符串 enum CodingKeys: String, CodingKey { case id, name, email } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) // 必须存在的字段直接解析 id = try container.decode(Int.self, forKey: .id) name = try container.decode(String.self, forKey: .name) // 可能为空的字段用decodeIfPresent,空值时用默认值"" email = try container.decodeIfPresent(String.self, forKey: .email) ?? "" } }
额外提示:用do-catch捕获解析错误
不管用哪种方法,都建议把decode调用放在do-catch块里,这样即使出现其他解析错误(比如类型不匹配),也能捕获错误而不是直接崩溃:
do { let user = try JSONDecoder().decode(User.self, from: jsonData) // 正常使用解析后的user实例 } catch let decodingError { print("JSON解析出错:\(decodingError.localizedDescription)") }
内容的提问来源于stack exchange,提问作者Gina
相关产品推荐
相关产品推荐

