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
相关产品推荐
相关产品推荐

