ios - 使用 Decodable 链接多个 JSON 请求 - Swift 5

标签 ios json swift iphone

我的“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/

相关文章:

ios - 快速保存和检索 UserDefaults 中的自定义对象

ios - 为什么纹理表面的透明和不透明区域之间存在暗边/光晕(在 opengl es 2.0 片段着色器中)

ios - 为什么在参数的参数中使用(点)?

string - swift 2 : Iterating and upper/lower case some characters

ios - kCGImageAlphaNone swift 中未解析的标识符

ios - 无法在 xcode 8 中导入桥接头

php - 从 ios Web 服务登录 android?

json - Angular 6 : use a service to get local json data

json - 如何在便利初始化程序中检查 Swift 中的 JSON nil

json - 我在 jq 中使用相同的语法来更改 JSON 值,但一种情况有效,而另一种情况则 bash 交互,我该如何解决这个问题?