解析 OpenWeather JSON 数据时出现 keyNotFound 错误(SwiftUI)

keyNotFound error when parsing OpenWeather JSON data (SwiftUI)

我需要使用 openWeather API 检索 "name" 对象,我设法解析 json 并检索数据,但对于它的特定对象,例如 "name" 我经常收到这个错误:

keyNotFound(CodingKeys(stringValue: "name", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"name\", intValue: nil) (\"name\").", underlyingError: nil))

需要帮助来解决这个问题。谢谢。

这是我的代码(在 3 个文件中):

//----------------------WeatherBrain File------------------------------

import Foundation
import SwiftUI

class ClimaBrain : ObservableObject {
    @Published var textFieldValue = ""
    @Published var urlString = ""
    @Published var weatherURL = "https://api.openweathermap.org/data/2.5/find?APPID=03c40ac21db250c8d1ce3aba0bf32c89&q="


    func performRequest(urlString: String){
        if let url = URL(string: urlString){
            let session = URLSession(configuration: .default)
            let task = session.dataTask(with: url) { (data, response, error) in
                if error != nil{
                    print(error!)
                    return
                }
                if let safeData = data{
                    self.parseJSON(weatherData: safeData)

                }
            }
            task.resume()
        }
    }


    func parseJSON(weatherData : Data){
        let decoder = JSONDecoder()
        do{
            let decodedData = try decoder.decode(WeatherData.self, from: weatherData)
            print("Brain Parse Data: \(decodedData.name)")
        } catch{
            print(error)
        }
    }


    func fetchWeather()  {
        urlString = "\(weatherURL)\(textFieldValue)&units=metric&"
        performRequest(urlString: urlString)
    }


    func endEditing() {
        UIApplication.shared.endEditing()
        self.fetchWeather()
    }

}


//----------------------WeatherData File------------------------------

import Foundation

struct WeatherData: Decodable {
    let name : String
    let main: Main
}


struct Main: Decodable {
    let temp: Double
}


//----------------------ContentView File------------------------------

import Foundation
import SwiftUI

struct ContentView: View {

    @ObservedObject var climaBrain = ClimaBrain()

    var body: some View {
        ZStack{
            Image("light_background")
                .resizable()
                .scaledToFill()
                .edgesIgnoringSafeArea(.all)
            VStack{
                HStack{

                    TextField("Search", text: $climaBrain.textFieldValue){
                        self.climaBrain.endEditing()
                        print("Return Key:  \(self.climaBrain.urlString)")
                    }
                    .keyboardType(.default)
                    .font(Font.custom("Halvetica", size: 30))
                    .frame(width: 200, height: 60, alignment: .center)
                    .padding(10)
                    VStack{
                        Button(action: {
                            self.climaBrain.endEditing()
                            print("Icon Button: \(self.climaBrain.urlString)")
                        }) {
                            Image(systemName: "magnifyingglass")
                                .renderingMode(.original)
                                .resizable()
                                .scaledToFit()
                                .frame(width: 50, height: 50, alignment: .center)
                        }
                    }
                }
            }
        }
    }
}

您希望 WeatherData 对象包含 2 个字段:namemain。但显然,实际数据不包含 name。您需要仔细检查您尝试解析的实际数据并更新您的 WeatherData 模型。