无法读取数据,因为 openweathermap 的格式不正确 api
The data couldn’t be read because it isn’t in the correct format with openweathermap api
我正在 swift 中使用 openweathermap api 开发天气应用程序并使用 mvvm json 解析数据 pattern.I 使用此代码显示数据无法读取因为它的格式不正确。
import UIKit
struct WeatherModel: Codable {
var main:String!
var description:String!
var icon:String!
var temp:Int?
enum CodingKeys: String, CodingKey {
case main = "main"
case description = "description"
case icon = "icon"
case temp = "temp"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
main = try values.decodeIfPresent(String.self, forKey: .main)
description = try values.decodeIfPresent(String.self, forKey: .description)
icon = try values.decodeIfPresent(String.self, forKey: .icon)
temp = try values.decodeIfPresent(Int.self, forKey: .temp)
}
}
这是模特
import UIKit
import Alamofire
class WeatherViewModel{
var modelWeather = [WeatherModel]()
weak var vc: ViewController?
func getWeather() {
AF.request("http://api.openweathermap.org/data/2.5/weather?q="+(vc?.cityTextField.text)!+"&units=metric&appid=88236c7916643a06e2cd64d56f4e5077", method: .get).response{
response in
debugPrint(response)
if let data = response.data
{
do{
let apiResponse = try JSONDecoder().decode(WeatherModel.self, from: data)
self.modelWeather.append(apiResponse)
debugPrint(apiResponse)
DispatchQueue.main.async {
self.vc?.reloadInputViews()
}
}catch let error{
print(error.localizedDescription)
}
}
}
}
}
{"coord":{"lon":67.0822,"lat":24.9056},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],"base":"stations","main":{"temp":28,"feels_like":27.67,"temp_min":28,"temp_max":28,"pressure":1014,"humidity":44},"visibility":6000,"wind":{"speed":2.57,"deg":50},"clouds":{"all":0},"dt":1616474499,"sys":{"type":1,"id":7576,"country":"PK","sunrise":1616463159,"sunset":1616507028},"timezone":18000,"id":1174872,"name":"Karachi","cod":200}
这是回应,但在api回应中有错误。
良好的第一步是正确建模 Main
。我检查了评论中使用的虚拟数据,您的 main
属性 缺少 main
词典中的嵌套词典。您可以通过简单地创建一个映射每个字典 key/value 对的结构来映射它。
struct Main: Codable {
let temp: Double
let feels_like: Double
let temp_min: Double
// Continue to add the rest of the dictionaries here.
}
完成后,将此结构添加到您的 属性 并使其成为 Main
类型,如下所示:
var main: Main
此外,您不需要添加 CodingKeys
,除非您的属性的命名与从服务器返回的 属性 名称不同。
编辑
如果你想找回
var description:String!
var icon:String!
您还需要创建一个 Weather
结构。
希望这对您有所帮助,您可以找出 WeatherModel
对象的其余映射。
我正在 swift 中使用 openweathermap api 开发天气应用程序并使用 mvvm json 解析数据 pattern.I 使用此代码显示数据无法读取因为它的格式不正确。
import UIKit
struct WeatherModel: Codable {
var main:String!
var description:String!
var icon:String!
var temp:Int?
enum CodingKeys: String, CodingKey {
case main = "main"
case description = "description"
case icon = "icon"
case temp = "temp"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
main = try values.decodeIfPresent(String.self, forKey: .main)
description = try values.decodeIfPresent(String.self, forKey: .description)
icon = try values.decodeIfPresent(String.self, forKey: .icon)
temp = try values.decodeIfPresent(Int.self, forKey: .temp)
}
}
这是模特
import UIKit
import Alamofire
class WeatherViewModel{
var modelWeather = [WeatherModel]()
weak var vc: ViewController?
func getWeather() {
AF.request("http://api.openweathermap.org/data/2.5/weather?q="+(vc?.cityTextField.text)!+"&units=metric&appid=88236c7916643a06e2cd64d56f4e5077", method: .get).response{
response in
debugPrint(response)
if let data = response.data
{
do{
let apiResponse = try JSONDecoder().decode(WeatherModel.self, from: data)
self.modelWeather.append(apiResponse)
debugPrint(apiResponse)
DispatchQueue.main.async {
self.vc?.reloadInputViews()
}
}catch let error{
print(error.localizedDescription)
}
}
}
}
}
{"coord":{"lon":67.0822,"lat":24.9056},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],"base":"stations","main":{"temp":28,"feels_like":27.67,"temp_min":28,"temp_max":28,"pressure":1014,"humidity":44},"visibility":6000,"wind":{"speed":2.57,"deg":50},"clouds":{"all":0},"dt":1616474499,"sys":{"type":1,"id":7576,"country":"PK","sunrise":1616463159,"sunset":1616507028},"timezone":18000,"id":1174872,"name":"Karachi","cod":200}
这是回应,但在api回应中有错误。
良好的第一步是正确建模 Main
。我检查了评论中使用的虚拟数据,您的 main
属性 缺少 main
词典中的嵌套词典。您可以通过简单地创建一个映射每个字典 key/value 对的结构来映射它。
struct Main: Codable {
let temp: Double
let feels_like: Double
let temp_min: Double
// Continue to add the rest of the dictionaries here.
}
完成后,将此结构添加到您的 属性 并使其成为 Main
类型,如下所示:
var main: Main
此外,您不需要添加 CodingKeys
,除非您的属性的命名与从服务器返回的 属性 名称不同。
编辑
如果你想找回
var description:String!
var icon:String!
您还需要创建一个 Weather
结构。
希望这对您有所帮助,您可以找出 WeatherModel
对象的其余映射。