Swift调用TheMovieDB API获取JSON数据:无法提取指定字段求助
解决Swift中从TMDB API提取电影概述和上映年份的问题
嘿,我明白你现在的困扰啦!你之所以打印obj["overview"]得到nil,是因为**overview字段根本不在顶层字典里**——看你贴的返回数据,顶层结构是包含page和results的字典,而results是一个数组,每一个数组元素才是单部电影的详细信息(包括overview、上映日期这些)。
咱们一步步来修正代码:
第一步:正确解析JSON结构
首先,咱们用Swift原生的[String: Any]来解析,比NSDictionary更符合Swift的风格,也更安全。核心步骤如下:
- 先把解析后的顶层数据转成
[String: Any]类型的字典 - 从顶层字典里取出
results数组,数组里每个元素都是单部电影的信息字典 - 检查数组是否有内容,取出第一个匹配的电影字典(搜索结果里第一个通常是最精准的匹配项)
- 从这个电影字典里提取
overview、release_date等目标字段
第二步:修正后的完整代码
let query = "Pulp+Fiction" let urlString = "https://api.themoviedb.org/3/search/movie?api_key={MYAPIKEY}&query=\(query)" guard let url = URL(string: urlString) else { print("无效的URL,请检查格式") return } URLSession.shared.dataTask(with: url) { (data, response, error) in // 处理请求错误 if let error = error { print("请求出错:\(error.localizedDescription)") return } // 确保返回数据不为空 guard let data = data else { print("未获取到返回数据") return } do { // 解析顶层字典 guard let topLevelDict = try JSONSerialization.jsonObject(with: data) as? [String: Any] else { print("无法解析为顶层字典") return } // 取出results数组 guard let movieResults = topLevelDict["results"] as? [[String: Any]] else { print("无法获取电影结果数组") return } // 检查是否有匹配的电影 guard let targetMovie = movieResults.first else { print("未找到匹配的电影") return } // 提取电影概述 if let overview = targetMovie["overview"] as? String { print("电影概述:\(overview)") } else { print("未找到电影概述信息") } // 提取上映年份(两种处理方式) if let releaseDateStr = targetMovie["release_date"] as? String { // 方式1:直接截取前4位(简单高效) if releaseDateStr.count >= 4 { let year = String(releaseDateStr.prefix(4)) print("上映年份:\(year)") } // 方式2:用DateFormatter规范解析(更严谨) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" if let releaseDate = dateFormatter.date(from: releaseDateStr) { let year = Calendar.current.component(.year, from: releaseDate) print("规范上映年份:\(year)") } } else { print("未找到上映日期信息") } // 如需其他字段(比如电影原名),用同样方式提取即可 if let originalTitle = targetMovie["original_title"] as? String { print("电影原名:\(originalTitle)") } } catch { print("JSON解析出错:\(error.localizedDescription)") } }.resume()
第三步:关键注意事项
- 一定要处理可选值:用
guard let或if let安全解包,避免因字段缺失、类型不匹配导致崩溃 - 如果需要处理多个搜索结果,可以遍历
movieResults数组,逐个提取每部电影的信息 - 记得替换代码中的
{MYAPIKEY}为你自己的TMDB API密钥
内容的提问来源于stack exchange,提问作者user4812000
相关产品推荐
相关产品推荐

