无法读取数据,因为 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 对象的其余映射。