You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4 JSON解析遇keyNotFound错误,求获取歌曲歌词方案

解决Swift 4解析JSON获取歌词的问题

看起来你遇到的问题主要是Codable结构体和JSON的层级结构不匹配,还有URL格式错误,我来帮你一步步修正:

问题分析

  1. JSON层级不匹配:你的目标JSON最外层是一个包含result键的对象,但你直接解码Result结构体,导致找不到artist键(因为artist在result内部);同时artist是单个对象,不是数组[Artist]。
  2. URL格式错误:你写的Beatles\Yesterday里的反斜杠是错误的,URL路径分隔应该用正斜杠/。
  3. 未对应歌词字段:歌词在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:34:27