Last.fm api json не читается быстрым декодером

Я пытаюсь создать простое приложение для поиска песен, используя API last.fm и быстрый пользовательский интерфейс. Когда я использую декодер с API-интерфейсом iTunes, он работает нормально, но когда я пытаюсь использовать last.fm, мое представление пусто, поэтому я предполагаю, что, возможно, объекты, которые я определил для json, неверны? Что-то новое в быстром, особенно чтение json-файлов из apis, так что это очень запутанно. Любая помощь/советы будут очень признательны.

ссылка на API: https://www.last.fm/api/show/track.search

ссылка json: http://ws.audioscrobbler.com/2.0/?method=track.search&track=hello&api_key=d527fc1829aecc7e54b63367b3d4621a&format=json


struct TracksRow: View {
    @State var term = "hello"
    @State var results = [Tracks]()
    
    var body: some View {
        List(results, id: \.songName){ item in
            VStack(alignment: .leading) {
                Text(item.songName)
                    .font(.headline)
                Text(item.singerName)
            }
        }.onAppear(perform: loadData)
        
    }
    
    func loadData(){
        guard let url = URL(string: "http://ws.audioscrobbler.com/2.0/?method=track.search&track=\(term)&api_key=d527fc1829aecc7e54b63367b3d4621a&format=json") else {
            print("Invalid URL")
            return
        }
        
        let request = URLRequest(url: url)
        
        URLSession.shared.dataTask(with: request) { data, response, error in
            if let data = data {
                if let decodedResponse = try? JSONDecoder().decode(SongResponse.self, from: data) {
                    
                    DispatchQueue.main.async {
                        self.results = decodedResponse.songs.trackMatches.matches
                    }
                    
                    return
                }
            }
            
        }.resume()
        
        
    }
}

struct TracksRow_Previews: PreviewProvider {
    static var previews: some View {
        TracksRow()
    }
}

JSON-объекты:


struct SongResponse: Codable{
    let songs : TrackResults
    
    enum CodingKeys: String, CodingKey {
        case songs = "results"
    }
}

struct TrackResults: Codable {
    var trackMatches: TrackMatches
   
    enum CodingKeys: String, CodingKey {
        case trackMatches = "trackmatches"
    }
}

struct TrackMatches: Codable {
    let matches : [Tracks]
    
    enum CodingKeys: String, CodingKey {
        case matches = "track"
    }
}

struct Tracks: Codable {
     let songName: String
     let singerName: String
     let albumImage: [TrackImage]
    
    enum CodingKeys: String, CodingKey {
        case songName = "name"
        case singerName = "artist"
        case albumImage = "image"
    }
}

struct TrackImage: Codable{
    let url: String
    let size: String
    
    enum CodingKeys: String, CodingKey{
        case url = "#text"
        case size
    }
}

person CartoonyAli    schedule 24.05.2021    source источник
comment
Никогда не используйте try? при декодировании внешних данных и/или разработке новых функций. Скорее всего, вы получаете ошибку, но с попыткой? вы игнорируете эту ошибку. Поэтому измените его на do { let decodedResponse = try JSONDecoder().decode( ... } catch { print(error) }, чтобы вы могли видеть, что идет не так.   -  person Joakim Danielson    schedule 24.05.2021
comment
У вас неправильные названия всех ключей.   -  person El Tomato    schedule 24.05.2021


Ответы (1)


У меня не возникло проблем при разборе API с вашим кодом. Я не думаю, что есть какие-либо проблемы с анализом JSON. Обновили ли вы info.plist с помощью безопасности App Transport?

введите здесь описание изображения

Это то, что отображает ваш код после того, как вы добавили указанный выше ключ.

введите здесь описание изображения

person Deepak Singh    schedule 24.05.2021
comment
Это была моя проблема! Большое спасибо! - person CartoonyAli; 24.05.2021