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

Swift解析含多嵌套对象JSON的技术求助及示例需求

Swift解析嵌套JSON数据的实现方案

针对你提供的嵌套JSON结构,我们可以利用Swift的Codable协议高效完成解析,以下是完整的步骤和示例代码:

1. 定义对应的数据模型

根据JSON的层级结构,创建匹配的结构体,所有结构体都遵循Codable协议(Swift会自动处理编码解码逻辑,无需手动实现方法):

// 最外层响应模型
struct MovieResponse: Codable {
    let itemInfo: ItemInfo
    let movieData: MovieData
    
    // 处理JSON下划线键名与Swift小驼峰属性名的映射
    enum CodingKeys: String, CodingKey {
        case itemInfo = "item_info"
        case movieData = "movie_data"
    }
}

// 对应item_info的模型
struct ItemInfo: Codable {
    let name: String
    let movieImage: String
    let youtubeTrailer: String
    let description: String
    let backdropPath: [String]
    let video: Video
    let audio: Audio
    
    enum CodingKeys: String, CodingKey {
        case name
        case movieImage = "movie_image"
        case youtubeTrailer = "youtube_trailer"
        case description
        case backdropPath = "backdrop_path"
        case video
        case audio
    }
}

// 对应video的模型
struct Video: Codable {
    let index: Int
    let codecName: String
    let codecLongName: String
    let profile: String
    
    enum CodingKeys: String, CodingKey {
        case index
        case codecName = "codec_name"
        case codecLongName = "codec_long_name"
        case profile
    }
}

// 对应audio的模型
struct Audio: Codable {
    let index: Int
    let codecName: String
    let codecLongName: String
    let profile: String
    
    enum CodingKeys: String, CodingKey {
        case index
        case codecName = "codec_name"
        case codecLongName = "codec_long_name"
        case profile
    }
}

// 对应movie_data的模型
struct MovieData: Codable {
    let id: Int
    let name: String
    let added: String // 若需转为Date类型,可修改类型并自定义解码逻辑
    let secondaryId: String
    
    enum CodingKeys: String, CodingKey {
        case id
        case name
        case added
        case secondaryId = "secondary_id"
    }
}

2. 执行JSON解析

假设你已通过API获取到JSON数据(Data类型),使用JSONDecoder完成解析:

// 模拟API返回的JSON字符串
let jsonString = """
{
  "item_info": {
    "name": "Example Name",
    "movie_image": "https://google.com",
    "youtube_trailer": "123",
    "description": "lorem ispum",
    "backdrop_path": [
      "https://google.com"
    ],
    "video": {
      "index": 0,
      "codec_name": "h264",
      "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
      "profile": "High"
    },
    "audio": {
      "index": 1,
      "codec_name": "aac",
      "codec_long_name": "AAC (Advanced Audio Coding)",
      "profile": "LC"
    }
  },
  "movie_data": {
    "id": 1,
    "name": "Example Name",
    "added": "1663373489",
    "secondary_id": "298"
  }
}
"""

// 转换为Data类型
guard let jsonData = jsonString.data(using: .utf8) else {
    print("无法将字符串转为Data")
    return
}

// 解析逻辑
do {
    let decoder = JSONDecoder()
    // 若需将时间戳转为Date,添加此配置
    // decoder.dateDecodingStrategy = .secondsSince1970
    let movieResponse = try decoder.decode(MovieResponse.self, from: jsonData)
    
    // 访问解析后的数据示例
    print("电影名称:\(movieResponse.itemInfo.name)")
    print("视频编码:\(movieResponse.itemInfo.video.codecName)")
    print("电影ID:\(movieResponse.movieData.id)")
} catch {
    print("解析失败:\(error.localizedDescription)")
}

3. 关键注意事项

  • 属性名映射:通过CodingKeys枚举完成JSON下划线命名与Swift小驼峰命名的匹配,避免解析字段不对应。
  • 可选值处理:若JSON中部分字段可能缺失,需将对应结构体属性改为可选类型(如let name: String?),防止解析崩溃。
  • 日期转换:若added字段需转为Date类型,可修改MovieData中added的类型为Date,并设置JSONDecoder的dateDecodingStrategy = .secondsSince1970(适配秒级时间戳)。
  • 数组处理:backdrop_path为字符串数组,直接用[String]类型即可完成解析。

内容的提问来源于stack exchange,提问作者ia244

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:36:12