在我的应用程序中,我有一个歌曲搜索功能,我可以调用 Happi API (https://happi.dev/docs/music),它将返回带有与传入的搜索关键字相匹配的歌曲信息的歌曲。
这是我访问数据的代码:
func getSongs(completion: @escaping(Result<[SongInfo], SongError>) -> Void) {
let dataTask = URLSession.shared.dataTask(with: resourceURL) { data, _, _ in
guard let jsonData = data else {
completion(.failure(.noDataAvailable))
return
}
do {
let decoder = JSONDecoder()
let songResponse = try decoder.decode(SongResponse.self, from: jsonData)
//print("decoded")
let songInfos = songResponse.response.results
completion(.success(songInfos))
}catch{
completion(.failure(.canNotProcessData))
}
}
dataTask.resume()
}
代码的
let dataTask
部分成功,并且不会返回 noDataAvailable
错误。但是,当我解码 JSON 数据时,我确实收到了 canNotProcessData
错误,我假设这是因为我的结构中存在错误,但并不完全确定。这是我的结构:
struct SongResponse:Decodable {
var response:Results
}
struct Results:Decodable {
var results: [SongInfo]
}
struct SongInfo:Decodable {
var songName:String
var artist:String
}
以下是来自 API 的 JSON 树的照片:
本质上,我想要的只是检索
results:[]
字典中的每个数组,然后对于每个数组,我想获取 track
和 artist
的值。例如,图像中有 5 个结果,对于每个结果,我想创建一个具有“曲目”和“艺术家”属性的歌曲类。这些歌曲类将存储在一个数组中。请让我知道如何更改我的代码,或者更简单的方法来执行此操作!
编辑:错误消息:
keyNotFound(CodingKeys(stringValue: "response", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "没有与键关联的值 CodingKeys(stringValue: "response", intValue: nil) ("response “)。”,底层错误:nil))
以下是正确的结构
do {
let decoder = JSONDecoder()
let songResponse = try decoder.decode(SongResponse.self, from: jsonData)
let songInfos = songResponse.result ?? []
completion(.success(songInfos))
}catch{
completion(.failure(.canNotProcessData))
}
// 型号
struct SongResponse: Decodable {
var success: Bool?
var result: [SongInfo]?
}
struct SongInfo: Decodable {
var track: String?
var artist: String?
}
要镜像json结构,您必须更改
SongResponse
中的密钥。
struct SongResponse: Decodable {
var result: [SongInfo]
}