Swift中使用Codable解析嵌套JSON时出现报错问题求助
问题排查与解决
你的解析失败核心原因是JSON中的键名和结构体属性名不匹配:
- JSON里的数组键是
"search-results"(连字符分隔) - 而你结构体里定义的属性是
search_results(下划线分隔)
JSONDecoder 默认不会自动处理这种连字符与下划线的转换,所以无法正确映射字段。下面提供两种可行的解决方法:
方法1:手动添加CodingKeys映射
给PagedCourses结构体添加CodingKeys枚举,明确指定search_results对应的JSON键为"search-results":
public struct PagedCourses: Codable { public struct Meta: Codable { public let page: Int // 此处CodingKeys可省略,属性名与JSON键完全匹配时编译器会自动生成 } public struct Course: Codable { public let id: Int // 此处CodingKeys同样可省略 } public let meta: Meta public let search_results: [Course] // 手动映射键名 enum CodingKeys: String, CodingKey { case meta case search_results = "search-results" } }
方法2:配置JSONDecoder的键解码策略
如果你有大量类似的连字符键需要转换为下划线格式属性,可以全局配置JSONDecoder的解码策略,让它自动完成转换:
let decoder = JSONDecoder() // 自定义策略:将连字符分隔的JSON键转为下划线分隔的属性名 decoder.keyDecodingStrategy = .custom { keys in let originalKey = keys.last!.stringValue let convertedKey = originalKey.replacingOccurrences(of: "-", with: "_") return CodingKey(stringValue: convertedKey)! } // 使用配置好的解码器解析 let courses = try? decoder.decode(PagedCourses.self, from: data)
额外提示:你定义的Meta和Course内部的CodingKeys是多余的——当属性名与JSON键完全一致时,编译器会自动生成对应的编码/解码逻辑,直接删除这些冗余代码能让结构更简洁。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

