无法从 JSON 获取字典

Unable to get Dictionary from JSON

如何从 Json 获取字典?

func getMovieByName(completion: @escaping (Bool, Any?, Error?) -> Void) {
    guard let url = URL(string:"https://api.themoviedb.org/3/search/movie?api_key=4cb1eeab94f45affe2536f2c684a5c9e&query='star") else { return }

    let session = URLSession.shared
    let task = session.dataTask(with: url) { (data, _, _) in
        guard let data = data else { return  }
        do {
            let items = try JSONDecoder().decode(Result.self, from: data)

            DispatchQueue.main.async {
                completion(true, items, nil)
            }
        } catch {
            DispatchQueue.main.async {
                completion(false, nil, error)
            }
        }
    }
    task.resume()
}

结果结构包含 "results"

的内容
struct Result: Codable {
    var results: [Movie]
}

添加变量以对应项目的字段

struct Movie: Codable {
    var id: Int
    var vote_count: Int
    var title: String

    //etc..
}

您可以为此创建一个 Swift 结构。这是你如何做的。

import Foundation

struct MovieStruct: Codable {
    let page, totalResults, totalPages: Int?
    let results: [Result]?

    enum CodingKeys: String, CodingKey {
        case page
        case totalResults = "total_results"
        case totalPages = "total_pages"
        case results
    }
}

struct Result: Codable {
    let voteCount, id: Int?
    let video: Bool?
    let voteAverage: Double?
    let title: String?
    let popularity: Double?
    let posterPath, originalLanguage, originalTitle: String?
    let genreIDS: [Int]?
    let backdropPath: String?
    let adult: Bool?
    let overview, releaseDate: String?

    enum CodingKeys: String, CodingKey {
        case voteCount = "vote_count"
        case id, video
        case voteAverage = "vote_average"
        case title, popularity
        case posterPath = "poster_path"
        case originalLanguage = "original_language"
        case originalTitle = "original_title"
        case genreIDS = "genre_ids"
        case backdropPath = "backdrop_path"
        case adult, overview
        case releaseDate = "release_date"
    }
}

创建结构后,您可以执行类似这样的操作来解析数据。

func getMovieByName(completion: @escaping (Bool, Any?, Error?) -> Void) {
    guard let url = URL(string:"https://api.themoviedb.org/3/search/movie?api_key=4cb1eeab94f45affe2536f2c684a5c9e&query='star") else { return }

    let session = URLSession.shared
    let task = session.dataTask(with: url) { (data, _, _) in
        guard let data = data else { return  }
        do {
            let items = try? JSONDecoder().decode(MovieStruct.self, from: jsonData)

            DispatchQueue.main.async {
                completion(true, items, nil)
            }
        } catch {
            DispatchQueue.main.async {
                completion(false, nil, error)
            }
        }
    }
    task.resume()
}

请注意,我已经使用您提供的 JSON 创建了结构。希望对你有帮助。