首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift中从API获取数据

在Swift中从API获取数据
EN

Stack Overflow用户
提问于 2021-02-27 20:34:31
回答 1查看 55关注 0票数 1

因此,我试图从Pokemon API获取数据,但我被困在试图将JSON解码为结构的点上。下面是我的代码:

代码语言:javascript
运行
复制
{
  "count":1118,
  "next":"https://pokeapi.co/api/v2/pokemon/?offset=20&limit=20",
  "previous":null,
  "results":
  [
    {"name":"bulbasaur","url":"https://pokeapi.co/api/v2/pokemon/1/"},
    {"name":"ivysaur","url":"https://pokeapi.co/api/v2/pokemon/2/"},
    {"name":"venusaur","url":"https://pokeapi.co/api/v2/pokemon/3/"},
    {"name":"charmander","url":"https://pokeapi.co/api/v2/pokemon/4/"},
    {"name":"charmeleon","url":"https://pokeapi.co/api/v2/pokemon/5/"},
    {"name":"charizard","url":"https://pokeapi.co/api/v2/pokemon/6/"},
    {"name":"squirtle","url":"https://pokeapi.co/api/v2/pokemon/7/"},
    {"name":"wartortle","url":"https://pokeapi.co/api/v2/pokemon/8/"},
    {"name":"blastoise","url":"https://pokeapi.co/api/v2/pokemon/9/"},
    {"name":"caterpie","url":"https://pokeapi.co/api/v2/pokemon/10/"},
    {"name":"metapod","url":"https://pokeapi.co/api/v2/pokemon/11/"},
    {"name":"butterfree","url":"https://pokeapi.co/api/v2/pokemon/12/"},
    {"name":"weedle","url":"https://pokeapi.co/api/v2/pokemon/13/"},
    {"name":"kakuna","url":"https://pokeapi.co/api/v2/pokemon/14/"},
    {"name":"beedrill","url":"https://pokeapi.co/api/v2/pokemon/15/"},
    {"name":"pidgey","url":"https://pokeapi.co/api/v2/pokemon/16/"},
    {"name":"pidgeotto","url":"https://pokeapi.co/api/v2/pokemon/17/"},
    {"name":"pidgeot","url":"https://pokeapi.co/api/v2/pokemon/18/"},
    {"name":"rattata","url":"https://pokeapi.co/api/v2/pokemon/19/"},
    {"name":"raticate","url":"https://pokeapi.co/api/v2/pokemon/20/"}
  ]
}
代码语言:javascript
运行
复制
func fetchPokemon() {
        
    let defaultSession = URLSession(configuration: .default)
        
    if let url = URL(string: "https://pokeapi.co/api/v2/pokemon/") {
            
        let request = URLRequest(url:url)
        let dataTask = defaultSession.dataTask(with: request, completionHandler: { (data, response, error) -> Void in
                
        guard error == nil else {
            print ("error: ", error!)
            return
        }
                
        guard data != nil else {
            print("No data object")
            return
        }
                
        guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else {
            print("response is: ", response!)
            return
        }
                
        guard let mime = response?.mimeType, mime == "application/json" else {
            print("Wrong MIME type!")
            return
        }
                
        DispatchQueue.main.async {
                        
            guard let result = try? JSONDecoder().decode(PokemonList.self, from: data!) else {
                print("Error Parsing JSON")
                return
            }

            let pokemon = result.pokemon
                        
            self.Pokemon = pokemon
                        
            print(self.Pokemon)
         }
        })
        dataTask.resume()
    }
}

下面是精灵宝可梦结构:

代码语言:javascript
运行
复制
struct Pokemon {
   // Various properties of a post that we either need or want to display
   let name: String
   let url: String
}

extension Pokemon: Decodable {
    // properties within a Post returned from the Product Hunt API that we want to extract the info from.
    enum PokemonKeys: String, CodingKey {
        // first three match our variable names for our Post struct
        case name = "name"
        case url = "url"
    }
    
    init(from decoder: Decoder) throws {
        let postsContainer = try decoder.container(keyedBy: PokemonKeys.self)
        name = try postsContainer.decode(String.self, forKey: .name)
        url = try postsContainer.decode(String.self, forKey: .url)
    }
}


struct PokemonList: Decodable {
   var pokemon: [Pokemon]
}

在解码时,它一直到“解析JSON时出错”的地步。我假设我设置精灵宝可梦结构体的方式可能有误?

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2021-02-28 16:32:33

由于数据模型不同,您将收到一个解析错误。你的结构应该是:

代码语言:javascript
运行
复制
struct PokemonList: Decodable {
    var results: [Pokemon]
    var count: Int
    var next: String
}

您不需要扩展名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66398856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档