ios - 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:[] 字典中的每个数组,然后对于每个数组,我想获取track
and的值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 )(“响应”)。”,基础错误:无))
解决方案
以下是正确的结构
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?
}
推荐阅读
- javascript - 我在 Ext js 中有表,我需要在标签中编写一些逻辑
- string - Python - 选择字符串中的文本,直到找到大于另一个日期的日期
- java - 基于注释而非限定符的 Cdi 运行时 bean 创建/注入
- r - 计算矩阵上同一行中的变量与所有其他变量之间的相关性
- mysql - MySQL按4个字段日期和时间排序
- django - 用户登录时使用 dj-rest-auth 获取身份验证令牌
- typescript - Vue3:在哪里声明与数据库的连接,调用数据库的方法?
- laravel - laravel 控制器如何在不自动递增的情况下插入 id?
- r - 执行任务的循环函数 R
- .htaccess - 重定向无法正常工作