Swift 4 JSON解析遇keyNotFound错误,求获取歌曲歌词方案
解决Swift 4解析JSON获取歌词的问题
看起来你遇到的问题主要是Codable结构体和JSON的层级结构不匹配,还有URL格式错误,我来帮你一步步修正:
问题分析
- JSON层级不匹配:你的目标JSON最外层是一个包含
result键的对象,但你直接解码Result结构体,导致找不到artist键(因为artist在result内部);同时artist是单个对象,不是数组[Artist]。 - URL格式错误:你写的
Beatles\Yesterday里的反斜杠是错误的,URL路径分隔应该用正斜杠/。 - 未对应歌词字段:歌词在
result.track.text里,你的结构体没有包含track相关定义。
修正后的代码
首先定义完全匹配JSON层级的Codable结构体:
// 对应JSON最外层的对象,包含result字段 struct RootResponse: Codable { let result: LyricResult } // 对应JSON里的result对象 struct LyricResult: Codable { let artist: Artist let track: Track } // 对应artist对象 struct Artist: Codable { let name: String } // 对应track对象,包含我们需要的歌词text struct Track: Codable { let name: String let text: String let lang: Language } // 可选:如果不需要语言信息,可以删掉这个结构体,把Track里的lang改成`let lang: [String: String]` struct Language: Codable { let code: String let name: String }
然后修正URL和网络请求代码,解码后获取歌词:
guard let url = URL(string: "https://orion.apiseeds.com/api/music/lyric/Beatles/Yesterday?apikey=xxx") else { print("无效的URL") return } URLSession.shared.dataTask(with: url) { (data, response, error) in if let error = error { print("请求错误: \(error.localizedDescription)") return } guard let data = data else { print("未返回有效数据") return } do { // 解码最外层的RootResponse let response = try JSONDecoder().decode(RootResponse.self, from: data) // 获取目标歌词 let lyrics = response.result.track.text print("歌词内容:\n\(lyrics)") } catch let jsonError { print("JSON解析错误: \(jsonError)") } }.resume()
关键说明
- 新增
RootResponse来对应JSON最外层的result键,确保解码时能正确定位到内部字段。 LyricResult包含了artist和track,其中track.text就是你需要的歌词内容。- 修正了URL里的路径分隔符,确保网络请求能正常发送。
这样修改后,你就能成功解析并获取到歌曲的歌词了。
内容的提问来源于stack exchange,提问作者user8210366
相关产品推荐
相关产品推荐

