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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:37:00