Swift中如何从JSON对象中获取数组?附代码示例
从POST请求返回的JSON中提取数组的完整方案
嘿,我来帮你搞定从这个POST请求返回的JSON里提取数组的事儿!咱们一步步来,先把你的代码补全优化,再针对不同的JSON结构做解析:
1. 先完善请求的完成回调逻辑
首先把你写的dataTask补全,还要加上必要的错误处理和任务启动:
// 建议用可选绑定替代强制解包,更安全 if let url = URL(string:"http://192.168.0.117/rest/login.php") { let parameters = ["email": email , "pwd":password] var request = URLRequest(url : url) request.httpMethod = "POST" request.httpBody = try? JSONSerialization.data(withJSONObject:parameters, options: []) // 加上Accept头,明确告诉服务器我们要JSON格式的响应 request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") let session = URLSession.shared let task = session.dataTask(with: request) { data, response, error in // 先处理网络层面的错误 if let error = error { print("网络请求出错啦: \(error.localizedDescription)") return } // 确保服务器返回了有效数据 guard let responseData = data else { print("服务器没有返回任何数据") return } // 调用专门的解析函数处理JSON self.parseResponseJSON(data: responseData) } task.resume() // 别忘了启动请求任务! } else { print("URL格式不正确,请检查地址") }
2. 编写JSON解析函数,提取数组
后端返回的JSON结构通常有两种情况,你可以根据实际返回的格式选对应的解析方式:
情况一:JSON根节点直接是数组
比如服务器返回的内容是这样的:
[ {"userId": 101, "username": "test_user1"}, {"userId": 102, "username": "test_user2"} ]
对应的解析代码:
func parseResponseJSON(data: Data) { do { // 直接把数据解析成字典数组 guard let resultArray = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] else { print("返回的JSON不是预期的数组格式") return } // 现在你就拿到了目标数组,可以遍历处理每一项 for user in resultArray { let userId = user["userId"] as? Int ?? 0 let username = user["username"] as? String ?? "未知用户" print("用户ID: \(userId), 用户名: \(username)") } } catch { print("JSON解析出错: \(error.localizedDescription)") } }
情况二:JSON根节点是字典,数组嵌套在某个key下
这是更常见的后端返回格式,比如:
{ "code": 200, "msg": "登录成功", "userList": [ {"userId": 101, "role": "管理员"}, {"userId": 102, "role": "普通用户"} ] }
对应的解析代码:
func parseResponseJSON(data: Data) { do { // 先把数据解析成字典 guard let resultDict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else { print("返回的JSON不是预期的字典格式") return } // 从字典中提取目标数组(这里的key是userList,你要换成后端实际返回的key) guard let userArray = resultDict["userList"] as? [[String: Any]] else { print("字典里找不到预期的数组key") return } // 遍历数组处理数据 for user in userArray { let userId = user["userId"] as? Int ?? 0 let role = user["role"] as? String ?? "未知角色" print("用户ID: \(userId), 角色: \(role)") } } catch { print("JSON解析出错: \(error.localizedDescription)") } }
3. 额外的优化小建议
- 如果你的项目是iOS 13及以上版本,推荐用
Codable协议来解析JSON,比JSONSerialization更类型安全,代码也更简洁。只需要定义对应的模型结构体,再用JSONDecoder解析就行。 - 所有的UI操作记得切回主线程,比如解析完数组后要更新UI的话,要在
DispatchQueue.main.async里执行。
内容的提问来源于stack exchange,提问作者Abhijit
相关产品推荐
相关产品推荐

