在 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 ?? "")")
}
}
GitHubstarred
APIreturns默认最多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)
}
}
我在 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 ?? "")")
}
}
GitHubstarred
APIreturns默认最多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)
}
}