如何 Json 用数组解码 API 数据?

How to Json decode API data with an array?

我正在学习 Swift 并尝试根据 Open Elevation API 的坐标获取海拔数据。

我找到了使用结构发出请求和解码数据的代码。

我的问题是 API 结果包含数组中的信息:

{"results": [{"latitude": 41.161758, "longitude": -8.583933, "elevation": 117}]}

到目前为止,我能够编写的程序确实将数据保存为 json.results 中的数组,但只有一个索引包含所有数据:

[API.MyResult(latitude: 41.16176, longitude: -8.583933, elevation: 117)]

(“API”为文件名)

这是我的代码:

import UIKit

class ViewController: UIViewController {

    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        
        let url = "https://api.open-elevation.com/api/v1/lookup?locations=41.161758,-8.583933"
        
        getData(from: url)
        
    }

    
    
    
    private func getData(from url: String){
        
        let task = URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: {data, response, error in
            
            guard let data = data, error == nil else {
                print("error")
                return
            }
            
            var result: Response?
            //print(result)
            
            
            
            do{
                result = try JSONDecoder().decode(Response.self, from: data)
            }
            catch{
                print(error.localizedDescription)
            }
            
            
            guard let json = result else {
                return
            }
        
            
            
            print(json.results)
            
            //print(json.results.latitude)
            //print(json.results.longitude)
            //print(json.results.elevation)
            
            
        })
        task.resume()
    }
    
    
    
}
    



struct Response: Codable {
    let results: [MyResult]
}
    
struct MyResult: Codable {
    let latitude: Float
    let longitude: Float
    let elevation: Int
}

尝试打印 json.results.latitude 导致错误

"Value of type '[MyResult]' has no member 'latitude'"

我假设在某些时候,必须将变量定义为数组。

这里需要更改什么?

result确实是单个对象,但是属性results是一个数组(多个对象)。

稍微不同的命名可以避免混淆。

备注:

  • 永远不要在解码上下文中打印文字 "error"error.localizedDescription,始终打印 error 实例。

  • 继续解析do范围内的结果

      private func getData(from url: String){
          guard let url = URL(string: url) else { print("Bad URL", url); return }
          let task = URLSession.shared.dataTask(with: url) {data, _, error in
              if let error = error { print(error); return }
              do {
                  let response = try JSONDecoder().decode(Response.self, from: data!)
                  for result in response.results {
                      print(result.latitude)
                      print(result.longitude)
                      print(result.elevation)
                  }
              }
              catch {
                  print(error)
              }
          }
          task.resume()
      }