[英]Swift 5: JSON object array to swift structure
我没有在 swift 中创建应用程序的经验,但请耐心等待。 我想从 JSON 格式的公共 API 获取数据并在 swift 中创建结构,所以我找到了一些教程,但我遇到了问题。
我很确定 api 返回 json 值,我已经通过测试
let dataAsString = String(data: data, encoding: .utf8)
我得到了正确的回应。
但是当我尝试从这个响应中制作对象时
let stations = try JSONDecoder().decode([Station].self, from: data)
print(stations) // returns nil
它打印此错误:
//Error: typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "gegrLat", intValue: nil)], debugDescription: "Expected to decode Double but found a string/data instead.", underlyingError: nil))
我所有的数据结构代码:
import UIKit
struct Commune: Codable{
var communeName: String
var districtName: String
var proviceName: String
}
struct City: Codable{
var id: Int
var name: String
var commune: Commune
}
struct Station: Codable {
var id: Int
var stationName: String
var gegrLat: Double
var gegrLon: Double
var city: City
var addressStreet: String?
}
class SearchViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let searchController = UISearchController(searchResultsController: nil)
self.navigationItem.searchController = searchController
let jsonUrlString = "http://api.gios.gov.pl/pjp-api/rest/station/findAll"
guard let url = URL(string: jsonUrlString) else { return }
URLSession.shared.dataTask(with: url){ (data, response, error) in
guard let data = data else { return }
//let dataAsString = String(data: data, encoding: .utf8)
//print(dataAsString) //working fine, returns string with data
//let json = try? JSONSerialization.jsonObject( with: data, options: .mutableContainers)
//print(json) //also working fine, returns json
do{
let stations = try JSONDecoder().decode([Station].self, from: data)
print(stations) // returns nil
} catch let jsonErr {
print("Error: ", jsonErr)
//Error: typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "gegrLat", intValue: nil)], debugDescription: "Expected to decode Double but found a string/data instead.", underlyingError: nil))
}
}.resume()
}
}
API 响应是对象数组,它看起来像:响应示例所以我想在我的应用程序中显示这个 object 的列表。
如果有任何帮助,我将不胜感激
更改您的“站”结构,使 gegrLon 和 gegrLat 是字符串:
struct Station: Codable {
var id: Int
var stationName: String
var gegrLat: String
var gegrLon: String
var city: City
var addressStreet: String?
}
即你的错误是说Expected to decode Double but found a string/data instead.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.