问题描述
我正在尝试使用 last.fm api 和 swift ui 制作一个简单的歌曲搜索应用程序。当我使用带有 itunes api 的解码器时,它工作正常,但是当我尝试使用 last.fm 时,我的视图是空白的,所以我假设我为 json 定义的对象可能是错误的?对 swift 有点陌生,尤其是从 apis 读取 json 文件,所以非常困惑。任何帮助/提示将不胜感激。
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
}
}