【问题标题】:How to parse json data that provides another url with more data如何解析为另一个 URL 提供更多数据的 json 数据
【发布时间】:2017-03-30 19:59:52
【问题描述】:

我有点困惑如何解析一个 json API,它给了我 20 个对象,然后给了我一个“下一个”键,它有一个 url,它给了我另外 20 个对象。我正在使用这个Pokemon API。它给了我 4 个键:count、previous、resultsnext。我试图在集合视图中显示它们,但不是同时显示它们。当收藏视图向下滚动时,我想加载更多。

我现在只是想知道这个名字。这就是我的代码的样子。

我让它加载收藏视图中的前 20 个口袋妖怪。但是我不知道如何加载下一个 20 口袋妖怪或 20 之后。如果链接不起作用,这就是 json 文件的样子。

如果能提供任何帮助,我将不胜感激。 :)

【问题讨论】:

  • 请不要发布代码截图,而是复制/粘贴代码。在delegate方法willDisplayCell中,如果有一定的限制,用url获取下一批。
  • 抱歉,Nayem,stack over flow 的新手并不知道人们更喜欢屏幕截图或代码。我也是 ISO 开发的新手,你介意给我看一个代码示例吗?

标签: ios json parsing swift3 uicollectionview


【解决方案1】:

您可以尝试使用递归函数重用 loadPokemonsData 函数,如下所示:

func loadPokemonsData(url: String, quantity: Int?) {
    let request = URLRequest(url: URL(string: url)!)

    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        if error != nil {
            print(error!)
        }


        do {
            let jsonResults = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionary

            let pokemonArray = jsonResults.value(forKey: "results") as! [[String: Any]]

            var isPokemonsEqualsToQuantity: Bool = false

            for pokemonData in pokemonArray {

                if let quantity = quantity {
                    guard self.pokemons.count < quantity else {
                        isPokemonsEqualsToQuantity = true
                        break
                    }
                }

                guard let name = pokemonData["name"] as? String else {
                    return
                }

                self.pokemon = Pokemon(name: name)
                self.pokemons.append(self.pokemon)
            }



            guard let nextURL = jsonResults.value(forKey: "next") as? String, !isPokemonsEqualsToQuantity else {
                for pokemon in self.pokemons {
                    print(pokemon.name)

                }
                print(self.pokemons.count)
                return
            }

            self.loadPokemonsData(url: nextURL, quantity: quantity)




        } catch let err as NSError {
            print(err.localizedDescription)
        }
    }

    task.resume()
}

附上一个算法函数运行的屏幕……它打印了 791 只宠物小精灵。

希望对你有帮助!

已编辑

下次你问的时候请把你的代码......它会更容易帮助你!。

  • 我已经更新了代码来设置你想要的数量(如果你想得到所有小精灵,则为零),因此它只会按照 API 返回的顺序获取小精灵,如果你想要来自所有小精灵的特定小精灵,你在获得所有口袋妖怪后可能会进行排序。

【讨论】:

  • 谢谢你,圣地亚哥它有效。然而,应用程序在运行几次后崩溃,api 给了我一个错误。 “请求被限制。预计在 2714.0 秒后可用。”我现在是因为对 api 的要求太多,有什么办法可以解决这个问题。再次感谢您回答我的主要问题。啊,感谢有关使用代码而不是屏幕截图的建议。 :)
  • 您的意思是第一次加载所有精灵时出现错误,还是多次加载所有精灵后出现错误?
  • 好的,代码很完美。我将守卫 let nextURL 放在 for 数组循环中,而不是在外面。想知道为什么它没有在控制台中打印任何内容,例如您的屏幕截图。但是它仍然在加载口袋妖怪,为什么?
  • 我猜你做错了什么,因为加载宠物小精灵不符合逻辑但不能打印。确保在所有口袋妖怪都保存在数组中并且没有更多要加载的口袋妖怪之后调用打印函数。
  • 你好,@santiago。我想知道你能不能再帮我一次。我想知道是否有办法只解析一定数量的对象。我只希望它解析第一个 721 而不是口袋妖怪的其余部分。不想发布另一个类似的问题。我试过使用重复和while循环,但似乎无法让它工作
猜你喜欢
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
相关资源
最近更新 更多