问题描述
我正在尝试快速解码一些 JSON,但我不断收到错误消息,我假设这是因为我的结构编写不正确。有任何想法吗?我正在调用这个 API https://pokeapi.co/api/v2/pokemon/1/
这里是 json 解码调用:
func fetchPokemonImages() {
for var pokemons in self.Pokemons {
let defaultSession = URLSession(configuration: .default)
if let url = URL(string: pokemons.url) {
let request = URLRequest(url: url)
let dataTask = defaultSession.dataTask(with: request) { (data,response,error) in
guard let pokemonImage = try? JSONDecoder().decode(PokemonImageList.self,from: data!) else {
print(error)
return
}
dispatchQueue.main.async {
self.PokemonsImage.append(contentsOf: pokemonImage.sprites)
self.PokemonTableView.reloadData() }
}
dataTask.resume()
}
}
}
这是我的结构:
struct PokemonImage: Codable {
let back_default: String
enum CodingKeys: String,CodingKey {
case backDefault = "back_default"
}
init(backDefault: String) {
self.backDefault = backDefault
}
init(from decoder: Decoder) throws {
let postsContainer = try decoder.container(keyedBy: CodingKeys.self)
backDefault = try postsContainer.decode(String.self,forKey: .backDefault)
}
}
struct PokemonImageList: Codable {
let sprites: [PokemonImage]
enum CodingKeys: String,CodingKey {
case sprites
}
}
解决方法
从 API 来看,您的共享 sprites
是一个对象,而不是一个数组
"sprites": {
"back_default": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/1.png","back_female": null,"back_shiny": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/shiny/1.png","back_shiny_female": null,"front_default": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/1.png","front_female": null,"front_shiny": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/shiny/1.png","front_shiny_female": null,"other": {
"dream_world": {
"front_default": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/dream-world/1.svg","front_female": null
},"official-artwork": {
"front_default": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/1.png"
}
}
所以 PokemonImageList 中的 sprites
应该是一个对象,而不是一个数组
struct PokemonImageList: Codable {
let sprites: PokemonImage
enum CodingKeys: String,CodingKey {
case sprites
}
}