I have an API call that has a ViewModel that takes in an API and transfers the data into an Array. I keep on getting an error with the conversion to JSON.
ViewModel:
class ViewModel: ObservableObject {
@Published var courses: [Course] = []
func fetch() {
guard let url = URL(string: "https://api.spaceflightnewsapi.net/v3/articles") else {
return
}
let task = URLSession.shared.dataTask(with: url) { [weak self]data, _, error in
guard let data = data, error == nil else {
return
}
// Convert to JSON
do {
let courses = try JSONDecoder().decode([Course].self, from: data)
DispatchQueue.main.async {
self?.courses = courses
}
} catch {
print(error) //---Error Here---
print("Error with converting to JSON")
}
}
task.resume()
}
}
Course is defined as:
struct Course: Hashable, Codable {
let name: String
let image: String
let id: Int
let title: String
let newsSite: String
let summary: String
let publishedAt: String
let updatedAt: String
let featured: Bool
let launches: String
let events: String
}
I then get the error:
keyNotFound(CodingKeys(stringValue: "name", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "No value associated with key CodingKeys(stringValue: "name", intValue: nil) ("name").", underlyingError: nil))
Have I forgot to do something inside of the Course
struct?
CodePudding user response:
...to fix coding keys error with JSON conversion
, try this exapme code,
that is, your models structs need to match the json data.
There is no name
, and no image
in the json data, also launches
and events
are not String.
struct Course: Identifiable, Hashable, Codable {
let id: Int
let title: String
let url: String // <-- here
let imageUrl: String // <-- here
let newsSite, summary, publishedAt, updatedAt: String
let featured: Bool
let launches: [Launch]? // <-- here
let events: [Event]? // <-- here
}
struct Event: Identifiable, Hashable, Codable {
let id: Int
let provider: String
}
struct Launch: Identifiable, Hashable, Codable {
let id, provider: String
}
Note, you will need to consult the docs to determine which properties are optional. In that case add ?
to it.