Swift调用GitHub API获取仓库文件夹名称:数据提取求助
GitHub API 提取仓库文件夹名称问题解决指南
核心问题定位
你当前代码的关键错误是对GitHub API响应格式判断有误:调用/repos/{owner}/{repo}/contents/{path}接口时,返回的JSON是对象数组,而非单个字典。你现在强行转成[String: Any],自然无法正确提取数据。
修正后的代码实现
下面是调整后的代码,能正确提取指定路径下的所有文件夹名称:
func extractFolderNames() { // 替换成实际的仓库owner和repo名称 guard let url = URL(string: "https://api.github.com/repos/your-username/your-repo/contents/folder") else { print("无效URL") return } let task = URLSession.shared.dataTask(with: url) { (data, response, error) in if let error = error { print("请求失败: \(error)") return } guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { print("响应异常,状态码: \(response?.description ?? "未知")") return } guard let mimeType = httpResponse.mimeType, mimeType == "application/json", let data = data else { print("无效的JSON数据") return } do { // 正确解析为对象数组 if let items = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] { // 筛选出类型为文件夹的项,提取名称 let folderNames = items.compactMap { item in if item["type"] as? String == "dir" { return item["name"] as? String } return nil } print("提取到的文件夹名称: \(folderNames)") // 这里可以添加后续逻辑,比如更新UI、存储数据等 } } catch { print("JSON解析失败: \(error.localizedDescription)") } } task.resume() }
后续操作方向建议
- 使用Codable简化解析:手动字典解析易出错,建议定义对应的数据模型,用
JSONDecoder解析,代码更易维护:
解析时替换为:struct GitHubContentItem: Codable { let name: String let type: String // 可根据需求添加其他字段,如path、url等 }let items = try JSONDecoder().decode([GitHubContentItem].self, from: data) let folderNames = items.filter { $0.type == "dir" }.map { $0.name } - 处理私有仓库:如果访问私有仓库,需要在请求头中添加Authorization字段,格式为
token YOUR_GITHUB_TOKEN - 分页处理:当文件夹内容超过100项时,API会返回分页数据,需要处理
Link响应头来获取下一页数据 - 主线程更新UI:如果需要将结果展示到界面,记得把UI操作切换到主线程(用
DispatchQueue.main.async)
内容的提问来源于stack exchange,提问作者Python12492
相关产品推荐
相关产品推荐

