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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:36:50