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

Swift新手求助:如何根据指定JSON创建结构体以成功解析?

解决Swift本地JSON解析的keyNotFound问题

嘿,这个问题我熟!你遇到的keyNotFound错误,核心原因是JSON键名和结构体属性名的大小写不匹配——你的JSON里顶层数组的键是"Users"(首字母大写),但解码时默认找的是小写的"users",Swift当然找不到对应的键啦😉

先看你的JSON结构:

{ "Users": [{ "name": "John", "username": "john1", "id": 1 }, { "name": "Smith", "username": "Sm2", "id": 2 }, { "name": "Nishanta", "username": "nisacharya", "id": 3 } ] }

下面是具体的解决步骤:

1. 正确定义Codable结构体

我们需要两个结构体:一个对应单个用户数据,一个对应整个JSON的顶层结构,重点通过CodingKeys处理大小写差异:

// 单个用户模型,字段名和JSON完全匹配,符合Swift命名规范
struct User: Codable {
    let name: String
    let username: String
    let id: Int
}

// 顶层响应模型,用CodingKeys映射大小写差异
struct UserResponse: Codable {
    let users: [User]
    
    // 自定义编码键,把Swift的`users`属性映射到JSON的`Users`键
    enum CodingKeys: String, CodingKey {
        case users = "Users"
    }
}

2. 本地JSON解析示例代码

这是读取并解析本地JSON文件的完整实现:

func parseLocalUserJSON() {
    // 替换成你的JSON文件名(不需要加.json后缀)
    guard let jsonFileURL = Bundle.main.url(forResource: "userList", withExtension: "json") else {
        print("错误:找不到本地JSON文件")
        return
    }
    
    do {
        // 读取文件数据
        let jsonData = try Data(contentsOf: jsonFileURL)
        let decoder = JSONDecoder()
        
        // 解码为我们定义的UserResponse类型
        let userResponse = try decoder.decode(UserResponse.self, from: jsonData)
        
        // 测试输出解析结果
        print("解析成功!共\(userResponse.users.count)个用户:")
        userResponse.users.forEach { user in
            print("- ID:\(user.id) | 姓名:\(user.name) | 用户名:\(user.username)")
        }
    } catch {
        print("解析失败:\(error.localizedDescription)")
    }
}

为什么这样能解决问题?

Swift的Codable默认是大小写敏感的,会直接用结构体属性名匹配JSON键名。用CodingKeys做映射,既能遵循Swift小驼峰的命名习惯,又能精准匹配JSON里的大写键名,完美解决找不到键的问题!

内容的提问来源于stack exchange,提问作者nis_acharya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:35:39