Swift如何定义适配嵌套JSON的Struct并解决JSONDecoder解码报错
问题排查与修复方案
一、Struct定义错误修复
你的Struct存在三处明显错误,会直接导致解码失败:
- 缺少JSON中存在的
texts、book两个属性的定义,Decodable协议默认要求所有JSON返回字段都有对应映射属性,除非你手动通过CodingKeys过滤不需要的字段 Lyrics结构体的字段映射CodingKeys枚举放错了作用域,你把它定义在了Chapter内部,系统无法识别Lyrics的字段对应规则- 没有把
Lyrics结构体和Chapter的texts字段做关联
修正后的Struct代码如下:
struct Chapter: Decodable, Identifiable { var id: Int var chapter: Int var amount: Int var texts: [Lyrics] var book: Int struct Lyrics: Codable { var lyricText: String var lyricNumber: Int enum CodingKeys: String, CodingKey { case lyricText = "lyric" case lyricNumber = "number" } } }
二、Invalid value around character 0报错的额外排查方向
这个报错的本质是JSONDecoder拿到的内容不是合法JSON结构,修复Struct后如果仍报错,按以下顺序排查:
- 解码前先把拿到的Data转成字符串打印,确认返回内容是否符合预期:在解码前添加代码
print(String(data: safeData, encoding: .utf8)),查看是否返回了404/500错误页、鉴权失败提示等非JSON内容 - 检查API请求是否缺少必要头信息,比如
Authorization鉴权头、Accept: application/json响应格式声明,部分接口未传对应头会返回HTML格式的错误内容 - 确认后端返回的JSON是否携带UTF-8 BOM头,部分服务端返回的JSON会带BOM头导致首字符识别失败,这种情况需要先移除BOM头再进行解码
内容的提问来源于stack exchange,提问作者erikvm
相关产品推荐
相关产品推荐

