如何 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()
}
我正在学习 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() }