JSON 解码器无法读取数据,因为它的格式不正确

Aka*_*ash 6 json swiftui

我是新来的。不知何故,我能够理解如何做到这一点。我在下面做,但它给出了错误 - 无法读取数据,因为它的格式不正确。有人可以帮助我吗?从过去的 4 天开始,我一直坚持这一点。我真的很感激。

import SwiftUI
import Foundation
import Combine

struct Movie: Decodable, Identifiable {

    var id: Int
    var video: String
    var vote_count: String
    var vote_average: String
    var title: String
    var release_date: String
    var original_language: String
    var original_title: String
}

struct MovieList: Decodable{
    var results: [Movie]

___________

class NetworkingManager : ObservableObject{
    var objectWillChange = PassthroughSubject<NetworkingManager, Never>()
    @Published var movies = [Movie]()

   init() {
      load()
   }

   func load(){
       let url = URL(string: "https://api.themoviedb.org/3/discover/movie?sort_by=popularity.desc&api_key=<HIDDEN>")!  

    URLSession.shared.dataTask(with: url){ (data, response, error) in

        do {
            if let d = data {
                let decodedLists = try JSONDecoder().decode([Movie].self, from: d)
                DispatchQueue.main.async {
                    self.movies = decodedLists
                }
            }else {
                print("No Data")
            }
        } catch {
            print (error.localizedDescription)
        }

            }.resume()

   }

} 
Run Code Online (Sandbox Code Playgroud)

这是响应的样子:

{
  "page": 1,
  "results": [
    {
      "id": 419704,
      "video": false,
      "vote_count": 1141,
      "vote_average": 6.2,
      "title": "Ad Astra",
      "release_date": "2019-09-17",
      "original_language": "en",
      "original_title": "Ad Astra",
      "genre_ids": [
        878
      ],
      "backdrop_path": "/5BwqwxMEjeFtdknRV792Svo0K1v.jpg",
      "adult": false,
      "overview": "An astronaut travels to the outer edges of the solar system to find his father and unravel a mystery that threatens the survival of Earth. In doing so, he uncovers secrets which challenge the nature of human existence and our place in the cosmos.",
      "poster_path": "/xJUILftRf6TJxloOgrilOTJfeOn.jpg",
      "popularity": 227.167,
      "media_type": "movie"
    },
    ]
}
Run Code Online (Sandbox Code Playgroud)

代码应该获取数据并将我创建的数组保存在其中。这样我就可以用它在前端显示。

Але*_*кий -1

Movie结构与 API 响应不匹配。你至少错过了顶层,比如pageresults数组。您可以在此处粘贴 JSON 答案并获取所需的结构:

// MARK: - APIAnswer
struct APIAnswer: Codable {
    let page: Int
    let results: [Result]
}

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

    enum CodingKeys: String, CodingKey {
        case id, video
        case voteCount = "vote_count"
        case voteAverage = "vote_average"
        case title
        case releaseDate = "release_date"
        case originalLanguage = "original_language"
        case originalTitle = "original_title"
        case genreIDS = "genre_ids"
        case backdropPath = "backdrop_path"
        case adult, overview
        case posterPath = "poster_path"
        case popularity
        case mediaType = "media_type"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您需要使用顶级结构,例如:

// ...
let decodeResult = try JSONDecoder().decode([APIAnswer].self, from: d)
let movieList = decodeResult.results
// the other advice: don't just take answer and put it to the array. 
// API can have errors too, so you can get the array with 2 equal id, for example

Run Code Online (Sandbox Code Playgroud)

更新第二次检查您的代码:您使用

let decodeResult = try JSONDecoder().decode([Movie].self, from: d)
Run Code Online (Sandbox Code Playgroud)

代替:

let decodeResult = try JSONDecoder().decode(MovieList.self, from: d)
Run Code Online (Sandbox Code Playgroud)

PS将来最好还附上 Xcode 的完整错误