我没有在swift中创建应用程序的经验,但请耐心等待。我想从公共API中获取JSON格式的数据,并在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响应是对象数组,它的样子是:response example 所以我想在我的应用程序中显示这个对象的列表。
如果有任何帮助,我将非常感激。
改变你的 "站 "结构,使gegrLon和gegrLat是Strings。
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.