使用 Swift 解析来自 YouTube API 的 JSON 响应
Parsing JSON response from YouTube API using Swift
当我从我的 Youtube 频道请求内容详细信息时,我在下面添加了我在控制台中收到的输出的精确副本。
请求是使用 Alamofire 发出的,但这可能无关紧要。这是 iOS 使用 Swift.
使用基本解码我可以到达 JSON 的第一级,但是我无法理解全面的 JSON 结构以及如何分解响应中的任何细节。
{
etag = "7m_KKUulP0TshaC_TW0-pQ-UEJU";
items = (
{
contentDetails = {
relatedPlaylists = {
favorites = FL0VZ0PEkyUOmPbVJ1rRcdVg;
likes = LL0VZ0PEkyUOmPbVJ1rRcdVg;
uploads = UU0VZ0PEkyUOmPbVJ1rRcdVg;
watchHistory = HL;
watchLater = WL;
};
};
etag = "QT41YKfmkOf65gBK7Fg_nqflh9Y";
id = UC0VZ0PEkyUOmPbVJ1rRcdVg;
kind = "youtube#channel";
snippet = {
description = "";
localized = {
description = "";
title = "James Faulkner";
};
publishedAt = "2017-09-27T20:56:20Z";
thumbnails = {
default = {
height = 88;
url = "https://yt3.ggpht.com/a/AATXAJzLxbetHiMHm4ssQvI0zF1aAiM29r1ulQKEUw=s88-c-k-c0xffffffff-no-rj-mo";
width = 88;
};
high = {
height = 800;
url = "https://yt3.ggpht.com/a/AATXAJzLxbetHiMHm4ssQvI0zF1aAiM29r1ulQKEUw=s800-c-k-c0xffffffff-no-rj-mo";
width = 800;
};
medium = {
height = 240;
url = "https://yt3.ggpht.com/a/AATXAJzLxbetHiMHm4ssQvI0zF1aAiM29r1ulQKEUw=s240-c-k-c0xffffffff-no-rj-mo";
width = 240;
};
};
title = "James Faulkner";
};
statistics = {
commentCount = 0;
hiddenSubscriberCount = 0;
subscriberCount = 0;
videoCount = 2;
viewCount = 96;
};
}
);
kind = "youtube#channelListResponse";
pageInfo = {
resultsPerPage = 1;
totalResults = 1;
};
}
谁能帮我开始破解这个JSON,让我们说一下高缩略图的URL?
您的控制台输出是对象打印。如果您想在响应数据的控制台中看到 JSON 格式输出,请使用以下代码:
if let JSONString = String(data: responseData, encoding: String.Encoding.utf8) {
print(JSONString)
}
尝试使用模型 类 解码来自 Alamofire 的响应数据,如下所示
模特
struct YouTubeModel: Codable {
let kind, etag: String?
let pageInfo: PageInfo?
let items: [Item]
}
struct Item: Codable {
let kind, etag, id: String?
let snippet: Snippet?
let contentDetails: ContentDetails?
}
struct ContentDetails: Codable {
let relatedPlaylists: RelatedPlaylists?
}
struct RelatedPlaylists: Codable {
let likes, favorites, uploads, watchHistory: String?
let watchLater: String?
}
struct Snippet: Codable {
let title, snippetDescription: String?
let publishedAt: String?
let thumbnails: Thumbnails?
let localized: Localized?
let country: String?
enum CodingKeys: String, CodingKey {
case title
case snippetDescription = "description"
case publishedAt, thumbnails, localized, country
}
}
struct Localized: Codable {
let title, localizedDescription: String
enum CodingKeys: String, CodingKey {
case title
case localizedDescription = "description"
}
}
struct Thumbnails: Codable {
let thumbnailsDefault, medium, high: Default
enum CodingKeys: String, CodingKey {
case thumbnailsDefault = "default"
case medium, high
}
}
struct Default: Codable {
let url: String
let width, height: Int
}
struct PageInfo: Codable {
let totalResults, resultsPerPage: Int?
}
在您的 Almofire 响应方法中,您在 post 中打印 responseData 对象:
let youTubeModel = try JSONDecoder().decode(YouTubeModel.self, from: responseData)
print(youTubeModel.items[0].snippet?.thumbnails?.high.url )
当我从我的 Youtube 频道请求内容详细信息时,我在下面添加了我在控制台中收到的输出的精确副本。
请求是使用 Alamofire 发出的,但这可能无关紧要。这是 iOS 使用 Swift.
使用基本解码我可以到达 JSON 的第一级,但是我无法理解全面的 JSON 结构以及如何分解响应中的任何细节。
{
etag = "7m_KKUulP0TshaC_TW0-pQ-UEJU";
items = (
{
contentDetails = {
relatedPlaylists = {
favorites = FL0VZ0PEkyUOmPbVJ1rRcdVg;
likes = LL0VZ0PEkyUOmPbVJ1rRcdVg;
uploads = UU0VZ0PEkyUOmPbVJ1rRcdVg;
watchHistory = HL;
watchLater = WL;
};
};
etag = "QT41YKfmkOf65gBK7Fg_nqflh9Y";
id = UC0VZ0PEkyUOmPbVJ1rRcdVg;
kind = "youtube#channel";
snippet = {
description = "";
localized = {
description = "";
title = "James Faulkner";
};
publishedAt = "2017-09-27T20:56:20Z";
thumbnails = {
default = {
height = 88;
url = "https://yt3.ggpht.com/a/AATXAJzLxbetHiMHm4ssQvI0zF1aAiM29r1ulQKEUw=s88-c-k-c0xffffffff-no-rj-mo";
width = 88;
};
high = {
height = 800;
url = "https://yt3.ggpht.com/a/AATXAJzLxbetHiMHm4ssQvI0zF1aAiM29r1ulQKEUw=s800-c-k-c0xffffffff-no-rj-mo";
width = 800;
};
medium = {
height = 240;
url = "https://yt3.ggpht.com/a/AATXAJzLxbetHiMHm4ssQvI0zF1aAiM29r1ulQKEUw=s240-c-k-c0xffffffff-no-rj-mo";
width = 240;
};
};
title = "James Faulkner";
};
statistics = {
commentCount = 0;
hiddenSubscriberCount = 0;
subscriberCount = 0;
videoCount = 2;
viewCount = 96;
};
}
);
kind = "youtube#channelListResponse";
pageInfo = {
resultsPerPage = 1;
totalResults = 1;
};
}
谁能帮我开始破解这个JSON,让我们说一下高缩略图的URL?
您的控制台输出是对象打印。如果您想在响应数据的控制台中看到 JSON 格式输出,请使用以下代码:
if let JSONString = String(data: responseData, encoding: String.Encoding.utf8) {
print(JSONString)
}
尝试使用模型 类 解码来自 Alamofire 的响应数据,如下所示
模特
struct YouTubeModel: Codable {
let kind, etag: String?
let pageInfo: PageInfo?
let items: [Item]
}
struct Item: Codable {
let kind, etag, id: String?
let snippet: Snippet?
let contentDetails: ContentDetails?
}
struct ContentDetails: Codable {
let relatedPlaylists: RelatedPlaylists?
}
struct RelatedPlaylists: Codable {
let likes, favorites, uploads, watchHistory: String?
let watchLater: String?
}
struct Snippet: Codable {
let title, snippetDescription: String?
let publishedAt: String?
let thumbnails: Thumbnails?
let localized: Localized?
let country: String?
enum CodingKeys: String, CodingKey {
case title
case snippetDescription = "description"
case publishedAt, thumbnails, localized, country
}
}
struct Localized: Codable {
let title, localizedDescription: String
enum CodingKeys: String, CodingKey {
case title
case localizedDescription = "description"
}
}
struct Thumbnails: Codable {
let thumbnailsDefault, medium, high: Default
enum CodingKeys: String, CodingKey {
case thumbnailsDefault = "default"
case medium, high
}
}
struct Default: Codable {
let url: String
let width, height: Int
}
struct PageInfo: Codable {
let totalResults, resultsPerPage: Int?
}
在您的 Almofire 响应方法中,您在 post 中打印 responseData 对象:
let youTubeModel = try JSONDecoder().decode(YouTubeModel.self, from: responseData)
print(youTubeModel.items[0].snippet?.thumbnails?.high.url )