我開始將我的前端 SwiftUI 專案連接到后端,所以我正在學習如何在 Swift 中進行 API 呼叫。我首先嘗試使用此視頻中的代碼作為一個可行的示例。但是,我遇到了JSONDecoder無法解碼回傳資料的錯誤。
這里發生了什么?對于這個直率的問題,我深表歉意——我是后端開發的新手。
let url = "https://api.sunrise-sunset.org/json?date=2020-01-01&lat=-74.060&lng=40.7128&form"
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("Something Went Wrong...")
return
}
// data is available
var result: Response?
do {
result = try JSONDecoder().decode(Response.self, from: data)
} catch {
print("failed to convert \(error.localizedDescription)")
}
guard let json = result else {
return
}
print(json.status)
print(json.results.sunrise)
})
task.resume()
}
struct Response: Codable {
let results: MyResult
let status: String
}
struct MyResult: Codable {
let sunrise: String
let sunset: String
let solar_noon: String
let day_length: Int
let civil_twilight_begin: String
let nautical_twilight_begin: String
let nautical_twilight_end: String
let astronomical_twilight_begin: String
let astronomical_twilight_end: String
}
請注意,我并沒有完全按照視頻進行操作。我getData從一個ViewController類中洗掉了這個函式,
因為我認為它不相關——我現在不處理任何視圖,我也不想。我還冒昧地在 Swift Playground 中測驗了代碼。不知道會不會有影響。
uj5u.com熱心網友回復:
您代碼中的主要問題是您的day_length資料型別。您正在嘗試解碼Int而回傳的資料是 a String。除此之外,使用camelCase 命名結構屬性是Swift 命名約定。匹配 json 所需要做的就是將 JSONDecoder 物件keyDecodingStrategy屬性設定為.convertFromSnakeCase. 并且在列印解碼錯誤時,您應該列印注釋中已經提到的errornot 它localizedDescription:
struct Response: Codable {
let results: MyResult
let status: String
}
struct MyResult: Codable {
let sunrise: String
let sunset: String
let solarNoon: String
let dayLength: String
let civilTwilightBegin: String
let nauticalTwilightBegin: String
let nauticalTwilightEnd: String
let astronomicalTwilightBegin: String
let astronomicalTwilightEnd: String
}
游樂場測驗:
let json = """
{"results":{"sunrise":"12:00:01 AM","sunset":"12:00:01 AM","solar_noon":"9:20:25 AM","day_length":"00:00:00","civil_twilight_begin":"12:00:01 AM","civil_twilight_end":"12:00:01 AM","nautical_twilight_begin":"12:00:01 AM","nautical_twilight_end":"12:00:01 AM","astronomical_twilight_begin":"12:00:01 AM","astronomical_twilight_end":"12:00:01 AM"},"status":"OK"}
"""
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let result = try decoder.decode(Response.self, from: Data(json.utf8))
print(result)
} catch {
print("Decoding error:", error)
}
這將列印:
回應(結果:MyResult(日出:“12:00:01 AM”,日落:“12:00:01 AM”,solarNoon:“9:20:25 AM”,dayLength:“00:00:00”,civilTwilightBegin : "12:00:01 AM", nauticalTwilightBegin: "12:00:01 AM", nauticalTwilightEnd: "12:00:01 AM", astronomicalTwilightBegin: "12:00:01 AM", astronomicalTwilightEnd: "12:00: 01 AM”),狀態:“OK”)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/341589.html
上一篇:JavascriptAPI呼叫導致我的Web應用程式凍結
下一篇:以隨機順序反應地圖渲染元素
