странный разбор JSON - PullRequest
       11

странный разбор JSON

0 голосов
/ 25 ноября 2018

Это должно быть мини-приложение pokedex, которое содержит покемонов.У меня много проблем с анализом этого конкретного JSON ....

{
count: 949,
next: null,
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/"
},

из https://pokeapi.co/api/v2/pokemon/

Это в основном JSON с несколькими URL-адресами.Исходный JSON содержит некоторые данные - массив структур покемонов.У меня нет проблем с разбором этого, но я даже не знаю, с чего начать с дополнительного URL.

первый бит данного внутреннего URL выглядит следующим образом (вся вещь огромна)

{
abilities: [
{
ability: {
name: "chlorophyll",
url: "https://pokeapi.co/api/v2/ability/34/"
},
is_hidden: true,
slot: 3
},
{
ability: {
name: "overgrow",
url: "https://pokeapi.co/api/v2/ability/65/"
},
is_hidden: false,
slot: 1
}
],
base_experience: 64,
forms: [
{
name: "bulbasaur",
url: "https://pokeapi.co/api/v2/pokemon-form/1/"
}
],
game_indices: [
{
game_index: 1,
version: {
name: "white-2",
url: "https://pokeapi.co/api/v2/version/22/"
}
},
{
game_index: 1,
version: {
name: "black-2",
url: "https://pokeapi.co/api/v2/version/21/"
}
},
{
game_index: 1,
version: {
name: "white",
url: "https://pokeapi.co/api/v2/version/18/"
}
},
{
game_index: 1,

из https://pokeapi.co/api/v2/pokemon/1/

Дело в том, что мне нужно толькоизвлечь определенные атрибуты из второго.Не уверен, как извлечь некоторые и игнорировать другие.Это то, что у меня есть до сих пор ...

struct Pokedex: Decodable {
    let count: Int?
    let next: Bool?
    let previous: Bool?
    let results: [Results]
}

struct Results: Decodable {
    let name: String?
    lt url: String?
}

struct Pokemon : Decodable {
    let weight: Int?
    let height: Int?
}

struct endPokemon {
    let name: String
    let weight: Int
    let height: Int
}

(вес и рост указаны во втором URL, но позже вниз по странице)

var pokemons = [Pokemon]()

    func loadJSON() {
        let url = "https://pokeapi.co/api/v2/pokemon/"
        guard let urlObj = URL(string: url) else { return }

        URLSession.shared.dataTask(with: urlObj) {(data, response, error) in
            guard let data = data else { return }

            do {
                let pokedex = try JSONDecoder().decode(Pokedex.self, from: data)

                for pokemon in pokedex.results {
                    guard let jsonURL = pokemon.url else { return }
                    guard let newURL = URL(string: jsonURL) else { return }

                    URLSession.shared.dataTask(with: newURL) {(data, response, error) in
                        guard let data = data else { return }

                        do {
                            let load = try JSONDecoder().decode(Pokemon.self, from: data)
                            self.pokemons.append(load)
                        } catch let jsonErr {
                            print("Error serializing inner JSON:", jsonErr)
                        }
                    }
                }
            } catch let jsonErr{
                print("Error serializing JSON: ", jsonErr)
            }
        }.resume()

Я не получаю никакихошибки работают, но массив pokemons пуст.

Есть мысли ??

1 Ответ

0 голосов
/ 25 ноября 2018

Ваши типы объектов выглядят хорошо.Единственная проблема не в том, чтобы вызвать .resume() на внутреннем dataTask.Проверьте исправленный фрагмент ниже,

func loadJSON() {
    let url = "https://pokeapi.co/api/v2/pokemon/"
    guard let urlObj = URL(string: url) else { return }

    URLSession.shared.dataTask(with: urlObj) {(data, response, error) in
        guard let data = data else { return }

        do {
            let pokedex = try JSONDecoder().decode(Pokedex.self, from: data)

            for pokemon in pokedex.results {
                guard let jsonURL = pokemon.url else { return }
                guard let newURL = URL(string: jsonURL) else { return }

                URLSession.shared.dataTask(with: newURL) {(data, response, error) in
                    guard let data = data else { return }

                    do {
                        let load = try JSONDecoder().decode(Pokemon.self, from: data)
                        self.pokemons.append(load)
                    } catch let jsonErr {
                        print("Error serializing inner JSON:", jsonErr)
                    }
                }.resume()
            }
        } catch let jsonErr{
            print("Error serializing JSON: ", jsonErr)
        }
        }.resume()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...