在 swift5 的 URL 上计算 JSON 数组中的对象数

Count number of objects in JSON array on a URL in swift5

我在 url = https://api.github.com/users/greenrobot/starred 处有一个 JSON 数组。
我想使用 swift 计算该数组中有多少个对象。我不想要数据,我只想要它的数量。

假设您将 URL 的内容下载到类型 Data 的变量 data 中:

if let object = try? JSONSerialization.jsonObject(with: data, options: []) as? [[String: AnyHashable]] {
    let count = object[0].keys.count
}

我假设您正在使用 Alamofire 进行网络请求。在下面的代码中,我们只是从 Alamofire 结果中提取值对象。我们将值转换为字典数组,然后您就可以得到计数。

AF.request("https://api.github.com/users/greenrobot/starred",method: .get).responseJSON { apiResponse in
        switch apiResponse.result{
        case .success(_):
            let dictionary = apiResponse.value as? [[String:Any]]
            print("dictionaryCount \(dictionary?.count ?? -1)")
        case .failure(_):
            print("error \(apiResponse.error?.underlyingError?.localizedDescription ?? "")")
        }
    }

GitHubstarredAPIreturns默认最多30条,以greenrobot为例一共372个没有意义

获取实际加星标项目数的聪明方法是指定 每页一个项目 并解析 HTTP 的 Link header包含最后一页编号的响应

Task {
    do {
        let url = URL(string: "https://api.github.com/users/greenrobot/starred?per_page=1")!
        let (_, response) = try await URLSession.shared.data(from: url)
        guard let link = (response as? HTTPURLResponse)?.value(forHTTPHeaderField: "Link") else {
            throw URLError(.badServerResponse)
        }
        let regex = try NSRegularExpression(pattern: "page=(\d+)")
        if let lastMatch = regex.matches(in: link).last {
            let range = Range(lastMatch.range(at: 1), in: link)!
            let numberOfStarredItems = String(link[range])
            print(numberOfStarredItems)
        } else {
            print("No match found")
        }
    } catch {
        print(error)
    }
}