JSON Декодирование с использованием декодируемого протокола с Swift 5 - PullRequest
0 голосов
/ 03 августа 2020

Я декодирую musi c API, используя декодируемый протокол.

Простые вещи работают хорошо, и я могу получить их с помощью ключа, однако есть массив жанров внутри массива результатов, у которого нет ключей.

Часть JSON:

"results": [{
    "country": "Europe",
    "year": "2017",
    "format": ["Vinyl", "LP", "Album", "Mispress"],
    "label": ["Parkwood Entertainment", "Columbia", "Sony Music", "Sony Music Entertainment", "Sony Music Entertainment International Services GmbH", "Columbia Records", "Columbia Records", "Parkwood Entertainment LLC", "Parkwood Entertainment LLC", "Celebrate Records GmbH", "Celebrate Records GmbH"],
    "type": "release",
    "genre": ["Electronic", "Rock", "Funk / Soul", "Pop"],
    "style": ["Rhythm & Blues", "Soul", "Neo Soul", "Electro", "Punk"],
    "id": 10869960,

моей модели в xcode: Здесь я не знаю, что мне нужно определить, если я не У меня нет ключа

    struct Results:Codable {
    
    var catno:String?
    var country:String?
    var id:Int?
    var master_id:Int?
    var thumb:String?
    var title:String?
    var genre:[Genre]?
    var type:String?
    var uri:String?
    var year:String?
    
}

struct Genre:Codable {
    
}

Моя функция, которую я использую для получения данных из API

private func getRecords(_ searchMethod:String, searchString:String) {
    // Check the requested search method and make api call with searchString
    var urlString:String = ""
    var resultsArray = [Results]()
    
    if searchMethod == "barcode" {
        urlString = DiscogsAPI.barcode + searchString + DiscogsAPI.token
    }
    else if searchMethod == "title" {
        urlString = DiscogsAPI.title + searchString + DiscogsAPI.token
    }
    
    // Session setup and api call
    let url = URL(string: urlString)
    
    guard url != nil else {
        return
    }
    
    let session = URLSession.shared
    let dataTask = session.dataTask(with: url!) { (data, response, error) in
        // Peform datatask and handle data
        if error == nil && data != nil {
            
            do {
                let decoder = JSONDecoder()
                let resultsData = try decoder.decode(Record.self, from: data!)
                let genreData = try decoder.decode(Genre.self, from: data!)
                
                resultsArray = resultsData.results!
                print(resultsArray[0].genre)
                DispatchQueue.main.async {
                    self.delegate?.discogsResult(resultsArray)
                }
            }
            catch {
                print("error getting data")
            }
            
        }
        else {
            print("data of error nil")
        }
    }
    dataTask.resume()
}
...