首页 > 解决方案 > Swift 和 API:解码 JSON 树

问题描述

在我的应用程序中,我有一个歌曲搜索功能,我在其中调用 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 树的照片:图片 1 图片 2

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

编辑:错误消息:keyNotFound(CodingKeys(stringValue: "response", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: "response", intValue: nil )(“响应”)。”,基础错误:无))

标签: iosjsonswiftapihttprequest

解决方案


以下是正确的结构

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

推荐阅读