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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:31:17