【问题标题】:Parsing JSON response from YouTube API using Swift使用 Swift 解析来自 YouTube API 的 JSON 响应
【发布时间】:2020-08-26 07:25:13
【问题描述】:

下面我添加了当我从我的 Youtube 频道请求内容详细信息时在控制台中收到的输出的确切副本。

请求是使用 Alamofire 发出的,但这可能无关紧要。这适用于使用 Swift 的 iOS。

使用基本解码我可以达到 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,让我们说一下 High Thumbnail 的 URL?

【问题讨论】:

  • 请提供有效的json
  • 嗯,这是直接提取的,当我把它作为一个“美化器”来清理它时,我得到了同样的回复。那就是它无效。但是我不明白为什么它会无效。
  • 您可以使用 app.quicktype.io?share=FmQcxvgKHRcSzxyY7mAk 自动生成 Codable 结构,但您需要有效的 JSON
  • 这已经是一个用 (NS)JSONSerialization 转换成 NSDictionary/NSArray/NSString 的 JSON。复制/粘贴您在 JSONValidator 中提供的内容(网上有很多),您会看到...它是 PropertyListSerialization.PropertyListFormat.openStep/

标签: json swift youtube youtube-api youtube-data-api


【解决方案1】:

您的控制台输出是对象打印。如果您想在响应数据的控制台中看到 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 响应方法中,您可以在帖子中打印 responseData 对象:

let youTubeModel = try JSONDecoder().decode(YouTubeModel.self, from: responseData)
print(youTubeModel.items[0].snippet?.thumbnails?.high.url )

【讨论】:

  • 太棒了,非常感谢。我将它设置在 responseJSON 中,这让我有些困惑,但 CodingKeys 等的使用受到了一定的限制。所以这真的帮助了我。再次感谢。
猜你喜欢
  • 2017-06-14
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
相关资源
最近更新 更多