Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift和api:解码JSON树_Ios_Json_Swift_Api_Httprequest - Fatal编程技术网

Ios Swift和api:解码JSON树

Ios Swift和api:解码JSON树,ios,json,swift,api,httprequest,Ios,Json,Swift,Api,Httprequest,在我的应用程序中,我有一个歌曲搜索功能,我调用Happi API(),它将返回歌曲信息与传入的搜索关键字匹配的歌曲 以下是我访问数据的代码: func getSongs(completion: @escaping(Result<[SongInfo], SongError>) -> Void) { let dataTask = URLSession.shared.dataTask(with: resourceURL) { data, _, _ in

在我的应用程序中,我有一个歌曲搜索功能,我调用Happi API(),它将返回歌曲信息与传入的搜索关键字匹配的歌曲

以下是我访问数据的代码:

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()
} 
以下是API中我的JSON树的照片:

基本上,我只想检索结果:[]字典中的每个数组,然后对于每个数组,我想获取
track
artist
的值。例如,在图像中有5个结果,对于每个结果,我想创建一个具有“track”和“artist”属性的歌曲类。这些歌曲类将存储在一个数组中。请让我知道如何更改我的代码,或者更简单的方法

编辑:错误消息:
keyNotFound(CodingKeys(stringValue:“response”,intValue:nil),Swift.DecodingError.Context(codingPath:[],debugDescription:“没有与键CodingKeys相关的值(stringValue:“response”,intValue:nil)(“response”)。”,underyingError:nil))

要镜像json结构,必须在
SongResponse
中更改键

struct SongResponse: Decodable {
    var result: [SongInfo]
}

以下是正确的结构

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?
}

在catch块中打印(错误)
,查看出了什么问题。错误消息通常非常详细和有用。此外,将您得到的JSON粘贴到app.quicktype.io中,以获得您需要的结构的非常合理的第一个版本need@Gereon谢谢我已更新我的问题,以显示我收到的错误
struct SongResponse: Decodable {
    var success: Bool?
    var result: [SongInfo]?
} 

struct SongInfo: Decodable {
    var track: String?
    var artist: String?
}