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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:11:04