Swift中如何从JSON字符串获取键值?含username提取示例
在Swift中解析JSON获取username值的方法
嘿,我来帮你搞定这个Swift解析JSON的问题!针对你给出的JSON结构,我平时做开发时常用两种方法来提取username值,一种适合简单场景的手动解析,另一种是更推荐的类型安全解析方式,我都给你详细演示一下:
方法一:手动解析(JSONSerialization)
这种方法不需要定义额外模型,直接逐层解析字典,适合结构简单的JSON:
let jsonString = """ { "user":{ "id":"74d93200-2ed2-437c-976f-83710eaea923","firstName":"dev","lastName":"che", "username":"dev_che"}} """ // 1. 把JSON字符串转成Data类型(JSONSerialization的输入要求) guard let jsonData = jsonString.data(using: .utf8) else { print("无法将字符串转换为Data") return } do { // 2. 将Data解析为字典类型 guard let jsonDict = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] else { print("JSON格式不符合预期") return } // 3. 逐层取出user字典,再提取username guard let userDict = jsonDict["user"] as? [String: Any], let username = userDict["username"] as? String else { print("无法找到或解析username字段") return } print("获取到的username:\(username)") // 输出: 获取到的username:dev_che } catch { print("解析失败:\(error.localizedDescription)") }
这种方法的优点是快速上手,不需要额外定义模型;缺点是需要手动处理所有类型转换,容易因强制解包或类型不匹配导致崩溃,适合临时处理简单JSON的场景。
方法二:使用Codable协议(推荐)
Codable是Swift自带的类型安全编码/解码协议,能让你通过定义模型结构体来和JSON结构映射,代码更易维护,出错时也能快速定位问题:
首先定义和JSON结构对应的模型:
// 对应外层的JSON结构(包含user字段) struct UserResponse: Codable { let user: User } // 对应用户信息的详细结构 struct User: Codable { let id: String let firstName: String let lastName: String let username: String }
然后用JSONDecoder进行解码:
let jsonString = """ { "user":{ "id":"74d93200-2ed2-437c-976f-83710eaea923","firstName":"dev","lastName":"che", "username":"dev_che"}} """ guard let jsonData = jsonString.data(using: .utf8) else { print("无法将字符串转换为Data") return } do { // 解码JSON到模型对象 let userResponse = try JSONDecoder().decode(UserResponse.self, from: jsonData) let username = userResponse.user.username print("获取到的username:\(username)") // 输出: 获取到的username:dev_che } catch { print("解码失败:\(error.localizedDescription)") }
这种方法的优势在于类型安全——编译器会帮你检查模型和JSON字段是否匹配,一旦JSON结构变动,编译阶段就能发现问题;同时代码更简洁,适合长期维护或复杂JSON的场景。如果JSON中的键名和Swift属性名不一致,还可以通过CodingKeys枚举来做映射。
内容的提问来源于stack exchange,提问作者Mahalakshmi Saravanan
相关产品推荐
相关产品推荐

