使用Alamofire从Youtube API(V3)提取playlistItems数据时出现问题。我正在尝试解码从Youtube API检索的JSON数据。
我尝试了很多解决方案,但没有一个对我有用。
在debugDescription中,我想访问“ items”,但它说“预期要解码Dictionary,但找到了一个字符串/数据。”,underlyingError:nil))。JSON结构:
{
"kind": "youtube#playlistItemListResponse",
"etag": "\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/4ZEGmjW-kzAxEtAgR_01JLhkDYA\"",
"nextPageToken": "CAEQAA",
"pageInfo": {
"totalResults": 13,
"resultsPerPage": 1
},
"items": [
{
"kind": "youtube#playlistItem",
"etag": "\"XpPGQXPnxQJhLgs6enD_n8JR4Qk/9HMdZkkdHtZumZsfvLpnSx1TBBI\"",
"id": "UExCQ0YyREFDNkZGQjU3NERFLkE2OTA3QzIwNEI3RjYxMDE=",
"snippet": {
"publishedAt": "2013-10-18T14:55:24.000Z",
"channelId": "UCvceBgMIpKb4zK1ss-Sh90w",
"title": "Andrew Willis, Skatepark Engineer",
"description": "Andrew Willis built a skatepark in East London using reclaimed materials left over from the Olympic Games, creating a lasting legacy for the local community of Hackney Wick.",
"thumbnails": {
"default": {
"url": "https://i.ytimg.com/vi/GvgqDSnpRQM/default.jpg",
"width": 120,
"height": 90
},
"medium": {
"url": "https://i.ytimg.com/vi/GvgqDSnpRQM/mqdefault.jpg",
"width": 320,
"height": 180
},
"high": {
"url": "https://i.ytimg.com/vi/GvgqDSnpRQM/hqdefault.jpg",
"width": 480,
"height": 360
},
"standard": {
"url": "https://i.ytimg.com/vi/GvgqDSnpRQM/sddefault.jpg",
"width": 640,
"height": 480
}
},
"channelTitle": "Google Search Stories",
"playlistId": "PLBCF2DAC6FFB574DE",
"position": 0,
"resourceId": {
"kind": "youtube#video",
"videoId": "GvgqDSnpRQM"
}
},
"contentDetails": {
"videoId": "GvgqDSnpRQM",
"videoPublishedAt": "2013-10-18T07:03:29.000Z"
}
}
]
}
这是我的代码:
struct PageInfo: Decodable {
var totalResults = 0
var resultsPerPage = 0
}
struct Snippet: Decodable {
var publishedAt: PublisedAt
var channelId = ""
var position = 0
var title = ""
var description = ""
var thumbnails: Thumbnail
var channelTitle = ""
var playListId = ""
var resourceId: Resource
}
struct ContentDetails: Decodable {
var videoId = ""
var videoPublishedAt = ""
}
struct Resource: Decodable {
var kind = ""
var videoId = ""
}
struct PublisedAt: Decodable {
var publishedAt = ""
}
struct ChannelUrl: Decodable {
var url = ""
var width = ""
var height = ""
}
struct Thumbnail: Decodable {
var medium: ChannelUrl
var high: ChannelUrl
var standard: ChannelUrl
var maxres: ChannelUrl
}
struct Item: Decodable {
var kind = ""
var etag = ""
var id = ""
var snippet: Snippet
var contentDetails: ContentDetails
}
struct Result: Decodable {
var kind = ""
var etag = ""
var nextPageToken = ""
var pageInfo: PageInfo
var items: [Item]
}
这是我的班级;
class VideoModel: NSObject {
let API_KEY = "My_API_KEY"
let UPLOAD_PLAYLIST_ID = "MY_Playlist_ID"
let VIDEO_URL = "https://www.googleapis.com/youtube/v3/playlistItems"
var snippets = [String]()
func getFeedVideos() {
Alamofire.request(VIDEO_URL, method: .get, parameters: ["part":"snippet, contentDetails", "playlistId": UPLOAD_PLAYLIST_ID, "key":API_KEY], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
guard let data = response.data else {
NSLog("no data")
return
}
do {
let decoded = try JSONDecoder().decode(Result.self, from: data)
debugPrint(decoded)
decoded.items.forEach({ (itemss) in
print(itemss.snippet.title)
self.snippets.append(itemss.snippet.title)
})
} catch {
debugPrint(error)
}