我从一个链接导入 JSON,其中每个文件都包含一个“下一个”属性,其中包含下一个 JSON 文件的 URL,直到它最终为 null 并遍历所有文件。
我的问题是,我怎样才能最好地导入所有这些连续的文件?因为它们在表中都是必需的,但根据 API 限制,每个 JSON 的限制是 20 个对象。
我认为答案是循环遍历结果并声明“如果对象数为 20,则将 URL 页码增加 1”?然后,一旦我点击最后一页并获得 8 个结果,它就会知道不要再进行一次循环?我只是无法理解它在代码中的工作方式以及它所在的位置。
当前请求:
open class ApiService: NSObject {
open func getData(completionHandler: @escaping (NSDictionary?, NSError?) -> Void) -> Self {
let requestUrl = "https://wger.de/api/v2/exercise/?format=json&language=2&status=2&?limit=199"
Alamofire.request(requestUrl, method: .get, encoding: URLEncoding.default)
.responseJSON { response in
switch response.result {
case .success( let data):
print("Request was sucessful")
completionHandler(data as? NSDictionary, nil)
case .failure(let error):
print("Request failed with error: \(error)")
completionHandler(nil, error as NSError?)
}
}
return self
}
编辑更新:尝试在评论中应用代码,这是我当前的代码,但我仍然有问题:
let requestUrl = "https://wger.de/api/v2/exercise/?format=json&language=2&status=2"
open func getData(_URL: NSURL, completionHandler: @escaping (NSDictionary?, NSError?) -> Void) -> Self {
Alamofire.request(requestUrl, method: .get, encoding: URLEncoding.default)
.responseJSON { response in
switch response.result {
case .success(let data):
print("Request was sucessful")
let json = data as! [String:Any]
let results = json["results"] as! NSDictionary; completionHandler(results, nil)
if let nextURL = json["next"] as? NSURL {self.getData(_URL: nextURL, completionHandler: completionHandler)} else { print(json["next"] as? String)
print("No next page, we are at the end")
}
case .failure(let error):
print("Request failed with error: \(error)")
completionHandler(nil, error as NSError?)
}
}
return self
最佳答案
更新你的代码(我还没有编译它)
open class ApiService: NSObject {
open func getData(requestUrl: String, completionHandler: @escaping (NSDictionary?, NSError?) -> Void) -> Self {
Alamofire.request(requestUrl, method: .get, encoding: URLEncoding.default)
.responseJSON { response in
switch response.result {
case .success(let data):
print("Request was sucessful")
completionHandler(data as? NSDictionary, nil)
case .failure(let error):
print("Request failed with error: \(error)")
completionHandler(nil, error as NSError?)
}
}
return self
}
}
您在 View Controller 中的代码
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let initialURLString = "https://wger.de/api/v2/exercise/?format=json&language=2&status=2"
getApiData(dataURL:initialURLString)
}
func getApiData(dataURL: String) {
let _ = apiService.getData(requestUrl: dataURL) {
(data, error) in
if let data = data {
if let results = data["results"] as? [[String:Any]] {
for result in results {
if let exercise = Exercise(dictionary: result) {
self.exercises.append(exercise)
}
}
self.exercisesTableView.reloadData()
}
if let nextURL = data["next"] as? String
{
print("NEXT URL: \(nextURL)")
self.getApiData(dataURL:nextURL)
}
}
}
}
关于json - 解析连续 JSON 文件的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40611986/