使用Swift 5的可解码协议进行JSON解码

时间:2020-08-03 19:54:21

标签: json swift decodable

我正在使用可解码协议解码音乐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()
}

0 个答案:

没有答案