Swift中使用Codable解析本地嵌套JSON报错,求解决方案
问题分析与解决方法
你的解析报错主要有两个核心问题,咱们一步步来修复:
1. 解析目标完全错误
你当前尝试解码的是PagedBreweries.Meta.self,但你的JSON根对象是包含meta和reweries(注意拼写)的完整分页数据结构,并非单独的Meta对象。这直接导致解码器在根层级找不到page字段,抛出keyNotFound错误。
2. JSON键与结构体属性拼写不匹配
JSON里数组对应的键是"reweries",但你结构体中定义的属性是breweries,二者拼写不一致(应该是JSON里的笔误)。就算修复了第一个问题,这个拼写差异也会导致解析失败。
另外,强烈建议替换try!为do-catch语句,这样能更友好地捕获错误细节,避免直接崩溃。
修正后的完整代码
// 先修正JSON中的拼写错误(如果无法修改原始JSON,就用后面的CodingKeys映射方案) let jsonNestedString = "{\"meta\":{\"page\":1,\"total_pages\":4,\"per_page\":10,\"total_records\" : 38}, \"breweries\":[{\"id\":1234,\"name\":\"saintArnold\"},{\"id\":52892,\"name\":\"buffalo bayou\"}]}" struct PagedBreweries: Codable { struct Meta: Codable { let page: Int let total_pages: Int let per_page: Int let total_records: Int // 这里的CodingKeys可以省略,因为属性名和JSON键完全匹配 // enum CodingKeys: String, CodingKey { // case page, total_pages, per_page, total_records // } } struct Brewery: Codable { let id: Int let name: String } let meta: Meta let breweries: [Brewery] // 如果无法修改原始JSON的"reweries"拼写,就添加下面的CodingKeys做映射 // enum CodingKeys: String, CodingKey { // case meta // case breweries = "reweries" // } } func jsonNested() { guard let jsonData = jsonNestedString.data(using: .utf8) else { print("字符串转Data失败") return } let decoder = JSONDecoder() do { let pagedData = try decoder.decode(PagedBreweries.self, from: jsonData) print("分页信息: \(pagedData.meta)") print("啤酒厂列表: \(pagedData.breweries)") } catch { print("解析错误: \(error.localizedDescription)") print("错误详情: \(error)") } } // 调用测试 jsonNested()
关键修正说明:
- 将解析目标从
PagedBreweries.Meta.self改为PagedBreweries.self,匹配JSON的根结构 - 修正了JSON中
reweries的拼写为breweries(如果无法修改原始JSON,就给PagedBreweries添加CodingKeys,把breweries映射到"reweries") - 用
guard let处理字符串转Data的可能失败,用do-catch捕获解析错误,避免强制解包和try!导致的崩溃
内容的提问来源于stack exchange,提问作者vgvishesh23113
相关产品推荐
相关产品推荐

