Разбор API-интерфейса Youtube в Swift 4 с помощью Alamofire - PullRequest
0 голосов
/ 07 сентября 2018

Пытаюсь разобрать api Youtube в использовании Alamofire в Swift 4 до сих пор я получил результаты и все хорошо, но у меня проблемы с доступом к "пунктам"

так что в основном я хочу получить доступ к заголовку, описанию, URL-адресу средних эскизов и результатовPerPage.

Я перепробовал много решений, но не, если они сработали специально для меня, я использую Swift4 и Alamofire

JSON:

{  
   "kind":"youtube#searchListResponse",
   "etag":"\"XI7nbFXulYBIpL0ayR_gDh3eu1k/N6oV8CScLhAtqc_fDnA3Nw4U3RA\"",
   "nextPageToken":"CBkQAA",
   "regionCode":"US",
   "pageInfo":{  
      "totalResults":922098,
      "resultsPerPage":25
   },
   "items":[  
      {  
         "kind":"youtube#searchResult",
         "etag":"\"XI7nbFXulYBIpL0ayR_gDh3eu1k/Oxu5v7t2PHcDK4wvSo-xsIp3Raw\"",
         "id":{  },
         "snippet":{  
            "publishedAt":"2011-03-21T08:32:25.000Z",
            "channelId":"UC1r4VtVE__5K6c_L_3Vlxxg",
            "title":"fouseyTUBE",
            "description":"",
            "thumbnails":{  
               "default":{  
                  "url":"https://yt3.ggpht.com/-oBs78-0JLws/AAAAAAAAAAI/AAAAAAAAAAA/zKWHSghRD3U/s88-c-k-no-mo-rj-c0xffffff/photo.jpg"
               },
               "medium":{  
                  "url":"https://yt3.ggpht.com/-oBs78-0JLws/AAAAAAAAAAI/AAAAAAAAAAA/zKWHSghRD3U/s240-c-k-no-mo-rj-c0xffffff/photo.jpg"
               },
               "high":{  
                  "url":"https://yt3.ggpht.com/-oBs78-0JLws/AAAAAAAAAAI/AAAAAAAAAAA/zKWHSghRD3U/s800-c-k-no-mo-rj-c0xffffff/photo.jpg"
               }
            },
            "channelTitle":"fouseyTUBE",
            "liveBroadcastContent":"none"
         }
      }
]
}

Мой код:

let url = "https://www.googleapis.com/youtube/v3/search"
        let parameters = ["q": searchText, "maxResults": 25, "part": "snippet", "type":"video", "key": "MY_YOUTUBE_API_KEY"] as [String : Any]

        Alamofire.request(url, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseData { (dataResponse) in
            if let err = dataResponse.error {
                print("Failed to contact server", err)
                return
            }

            guard let data = dataResponse.data else {return}
            do{
                let searchResult = try
                    JSONDecoder().decode(SearchResults.self, from: data)
                print("Results Count:", searchResult.kind)
                searchResult.items.forEach({ (data) in

                    print(searchResult.items["data"]["items"])
                })
                self.musics = searchResult.items
                self.tableView.reloadData()

            }catch let decodeErr {
                print("Failed to Descode: ", decodeErr)
            }


        }
    }

    struct SearchResults: Decodable{
        let kind: String
        let items: [Music]
    }

Music.Swift file

struct Music: Decodable {
    var etag: String?
    var kind: String?
    //let time: String
}

1 Ответ

0 голосов
/ 07 сентября 2018

Я бы предложил создать декодируемую структуру для каждого вложенного элемента, например,

struct PageInfo: Decodable {
    var totalResults = 0
    var resultsPerPage = 0
}


struct Snippet: Decodable {
    var channelId = ""
    var title = ""
    var description = ""
    var channelTitle = ""
    var thumbnails: Thumbnail
}


struct ChannelURL: Decodable {
    var url = ""
}

struct Thumbnail: Decodable {
    var medium: ChannelURL
    var high: ChannelURL
}

struct Item: Decodable {
    var kind = ""
    var etag = ""
    var snippet: Snippet

}


struct Result: Decodable {
    var kind = ""
    var etag = ""
    var pageInfo: PageInfo
    var items: [Item]
}

А затем приступить к декодированию. Следующая расшифровка работает с вашим ответом выше.

    do {


        let decoded = try JSONDecoder().decode(Result.self, from: data)
        debugPrint(decoded)


        //Now access the data
        print(decoded.pageInfo.resultsPerPage) // 25

        //since the items is array we take first for now
        if  let firstItem = decoded.items.first {
            //to print the first one
            print(firstItem.snippet.channelTitle) // "fouseyTUBE"

            //same for URL
            print(firstItem.snippet.thumbnails.medium.url) // https://yt3.ggpht.com/-oBs78-0JLws/AAAAAAAAAAI/AAAAAAAAAAA/zKWHSghRD3U/s240-c-k-no-mo-rj-c0xffffff/photo.jpg
        }


    } catch {
        debugPrint("\(error.localizedDescription)")
    }

Это лучший сценарий, в котором присутствуют все данные. Так что вам придется изменить свою структуру соответственно, сделав несколько значений ``

...