正在尝试解码来自 Youtube Api 个热门视频的数据 swift 获得 "Expected to decode Array<Any> but found a dictionary instead"

Trying to decode data from Youtube Api popular videos in swift getting "Expected to decode Array<Any> but found a dictionary instead"

我是 swift 的新手,我正在学习将数据从 Api 解析到我的 Swift 应用程序。 我试图从热门视频的 Youtube APi 获取数据 :(https://developers.google.com/youtube/v3/docs/videos/list) 但我无法获取数据,不知道我哪里出错了。但它给出了“预期解码数组但找到了字典。”

这是我的模型:

struct Items: Codable {
    
    let kid : String
}


struct PopularVideos: Codable, Identifiable {
    
    let id: String?
    let kind : String
    let items : [Items]
}

我的Api请求方法:

//Getting Api calls for youtube video
func getYoutubeVideo(){
        
    let url = URL(string: "https://www.googleapis.com/youtube/v3/videos?part=snippet&chart=mostPopular&regionCode=US&key=\(self.apiKey)")!
    URLSession.shared.dataTask(with: url){(data, response, error) in
            
        do {
            let tempYTVideos = try JSONDecoder().decode([PopularVideos].self, from: data!)
                
            print(tempYTVideos)
                
            DispatchQueue.main.async {
                self.YTVideosDetails = tempYTVideos
                    
            }
        }
        catch {  
            print("There was an error finding data \( error)")
        }
    } .resume()
}

API 调用返回的根对象不是数组。它是一个包含 Item.

数组的简单对象

那么,你想要

let tempYTVideos = try JSONDecoder().decode(PopularVideos.self, from: data!)

此外,您的数据结构看起来也不对;根对象中没有 id 属性,项目中也没有 kid 属性。一个项目有一个 kind 和一个 id

我还建议您将结构命名为 Item 而不是 Items,因为它代表单个项目;

struct Item: Codable, Identifiable {
    
    let kind: String
    let id: String
}


struct PopularVideos: Codable {
    
    let kind : String
    let items : [Item]
}