如何在Swift中解析嵌套结构的JSON数据?
在Swift中解析嵌套JSON的方法
嘿,我来帮你搞定这个嵌套JSON的解析问题!针对你给出的这种外层包着item的结构,最简洁高效的方式就是用Swift自带的Codable协议,这也是现在Swift开发里的标准做法,比手动解析省心太多啦。
方法一:用Codable协议(推荐)
第一步:定义对应的数据模型
首先你要根据JSON的结构,定义两个符合Codable协议的结构体——一个外层的容器,一个对应item里的内容:
// 对应外层的JSON结构 struct Response: Codable { let item: Article } // 对应item里的具体内容 struct Article: Codable { let id: Int let title: String let subtitle: String let body: String let date: String }
这里要注意:结构体里的属性名必须和JSON里的键名完全一致(大小写也要匹配哦),如果想改属性名的话,可以用CodingKeys枚举来映射,不过你的例子里键名很规范,直接用就行。
第二步:编写解析代码
接下来就可以把JSON数据(不管是从网络请求来的Data,还是本地字符串转的Data)解析成我们定义的模型了:
// 假设你已经有了JSON的Data(比如从网络请求获取,或者从字符串转换) let jsonString = """ { "item":{ "id":33, "title":"Article 5", "subtitle":"Tasing 123", "body":"Hello world " , "date":"15/04/2013 11:48" } } """ guard let jsonData = jsonString.data(using: .utf8) else { print("Failed to convert string to data") return } do { let response = try JSONDecoder().decode(Response.self, from: jsonData) // 解析成功,现在可以用response.item来访问所有属性啦 print("文章ID:\(response.item.id)") print("标题:\(response.item.title)") print("日期:\(response.item.date)") } catch { print("解析出错:\(error.localizedDescription)") }
解析成功后,你就能通过response.item轻松拿到每个字段的值啦,是不是很简单?
方法二:手动解析(JSONSerialization)
如果你不想用Codable,也可以用老方法JSONSerialization手动解析,但这种方式需要自己处理类型转换,容易出错,不太推荐:
do { guard let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] else { print("JSON格式不对") return } guard let item = jsonObject["item"] as? [String: Any] else { print("找不到item字段") return } let id = item["id"] as? Int ?? 0 let title = item["title"] as? String ?? "" let subtitle = item["subtitle"] as? String ?? "" let body = item["body"] as? String ?? "" let date = item["date"] as? String ?? "" // 这里可以把这些值组装成自定义对象或者直接使用 print("手动解析的标题:\(title)") } catch { print("手动解析出错:\(error.localizedDescription)") }
这种方式需要一层层拆字典,还要处理可选类型的默认值,代码量更大,也更容易出bug,所以还是优先用Codable哦。
内容的提问来源于stack exchange,提问作者BigMac
相关产品推荐
相关产品推荐

