我的“url
”对象有一个链接,该链接捕获用户在搜索栏中输入的内容以完成链接,然后开始 JSON 过程。 JSON 完成解析后,第一个链接会响应另一个链接。在我的 if let validLink = result.link
中,您会看到我将链接信息存储到数组中。现在我不确定是否应该在 if let validLink = result
中开始另一个 JSON 响应,或者是否应该创建一个新函数,就像我在下面的代码中尝试做的那样,基本上复制并在下面粘贴相同的 JSON 信息来重新解析它。第二个链接出现解析错误。最有效、最正确的方法是什么?我真的被困在这里了。
我尝试创建另一个函数,该函数使用第一个 JSON 解析中的信息,使用新链接再次重新解析。
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
if let searchText = searchController.searchBar.text, !searchText.isEmpty {
let url = URL(string: "http://djp-dev/api/item?q=\(String(describing: searchText))&dev=1")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
guard let data = data,
error == nil else {
print(error?.localizedDescription ?? "Response Error")
return }
do {
let jsonResult = try JSONDecoder().decode(Response.self, from: data)
let resultsArray = jsonResult.results
for result in resultsArray {
if let validLink = result.link {
print(validLink)
self.collectLink.append(validLink)
self.mainParse()
}
}
} catch {
print("Parse Error")
}
}
task.resume()
}
}
func mainParse() {
let url = URL(string: "http://djp-dev\(collectLink[0])?dev=1")
print(url!)
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
guard let data = data,
error == nil else {
//print(error?.localizedDescription ?? "Response Error")
return }
do {
let jsonResult = try JSONDecoder().decode(JSONResponse.self, from: data)
let mainArray = jsonResult.locations
for main in mainArray {
print("""
Manufacture = \(main.rid)
Description = \(main.description)
""")
/*if let validLink = result.description! {
}*/
}
} catch {
print("Parse Error")
}
}
task.resume()
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
我基本上会向http://djp-dev/api/item?q=\(String(describing: searchText))&dev=1
询问它发回给我的响应中的链接。我希望使用它发送给我的链接来启动另一个 JSON 请求。我不确定是否应该将其全部保留在一个请求中,或者使用全新的 JSON 请求创建一个全新的函数。 if let validLink = result.link { }
是我收到第二个链接信息的时候。
最佳答案
所以我已经弄清楚了。我使用的是 Decodable,没有 CodingKeys。感谢 Vadian 为我指明了正确的方向。这是我的例子:
struct Response : Decodable {
let results: [Results]
enum CodingKeys: String, CodingKey {
case results = "photos"
}
}
struct Results : Decodable {
let url : String?
enum CodingKeys: String, CodingKey {
case url = "url"
}
}
关于ios - 使用 Decodable 链接多个 JSON 请求 - Swift 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57433089/