首先,我的问题可能已经被问到,但是我在许多教程和论坛上搜索,而且我无法做到这一点,因为我是法语,英语不是很好。
我尝试使用我的应用程序阅读JSON,但它不起作用。唯一印刷的是" Foundation.jsondecoder"
这是我的Swift 4代码:
func getSpots(){
guard let downloadURL = URL(string: "http://dronespot.fr/getSpot.php") else { return }
URLSession.shared.dataTask(with: downloadURL) { data, urlResponse, error in
guard let data = data, error == nil, urlResponse != nil else {
print("Oops Call for Help")
return
}
print("downloaded")
do
{
let decoder = JSONDecoder()
//let rates = try decoder.decode([Artwork].self, from: data)
print(decoder)
} catch {
print("Error after loading")
}
}.resume()
}
Artwork.swift:
init?(json: [Any]) {
// 1
self.title = json[16] as? String ?? "No Title"
self.locationName = json[12] as! String
self.id = 3
self.img = "tamere"
// 2
if let latitude = Double(json[18] as! String),
let longitude = Double(json[19] as! String) {
self.coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
} else {
self.coordinate = CLLocationCoordinate2D()
}
}
期望JSON:
http://dronespot.fr/getspot.php感谢您的帮助
,因为您想使用JSONDecoder
您的方法是完全错误的(除了您评论了解码JSON的实际行以外的问题外(。
将Artwork
创建为采用Decodable
的结构,将JSON中的键声明为属性,并添加一个懒惰的实例化变量以构建坐标:
struct Artwork : Decodable {
let nom : String
let description : String
let id: String
let img1 : String
let latitude : String
let longitude : String
// there are much more keys
lazy var coordinate : CLLocationCoordinate2D = {
return CLLocationCoordinate2D(latitude: Double(latitude) ?? 0.0, longitude: Double(longitude) ?? 0.0)
}()
}
现在解码Artwork
do {
let decoder = JSONDecoder()
let rates = try decoder.decode([Artwork].self, from: data)
print(rates)
} catch {
print("Error after loading", error)
}