使用 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 )