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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:40:37