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
相关产品推荐
相关产品推荐

