Ios 如何解析为另一个url提供更多数据的json数据
我有点困惑,我该如何解析一个json API,它给了我20个对象,但又给了我一个“下一步”键,该键有一个url,它给了我另外20个对象。我在用这个。它给我4个键:计数、上一个、结果和下一个。我试图在集合视图中显示它们,但不是同时显示所有。当集合视图向下滚动时,我想加载更多 我现在只是想知道名字。这就是我的代码的样子 我让它加载集合视图中的前20个口袋妖怪。然而,我不知道如何加载下一个20口袋妖怪或20后。如果链接不起作用,json文件就是这样的Ios 如何解析为另一个url提供更多数据的json数据,ios,json,parsing,swift3,uicollectionview,Ios,Json,Parsing,Swift3,Uicollectionview,我有点困惑,我该如何解析一个json API,它给了我20个对象,但又给了我一个“下一步”键,该键有一个url,它给了我另外20个对象。我在用这个。它给我4个键:计数、上一个、结果和下一个。我试图在集合视图中显示它们,但不是同时显示所有。当集合视图向下滚动时,我想加载更多 我现在只是想知道名字。这就是我的代码的样子 我让它加载集合视图中的前20个口袋妖怪。然而,我不知道如何加载下一个20口袋妖怪或20后。如果链接不起作用,json文件就是这样的 如果您能提供任何帮助,我将不胜感激。:)
如果您能提供任何帮助,我将不胜感激。:) 您可以尝试使用递归函数重用
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()
}
func loadPokemonsData(url:String,quantity:Int?){
let request=URLRequest(url:url(string:url)!)
让task=URLSession.shared.dataTask(with:request){(data,response,error)在
如果错误!=nil{
打印(错误!)
}
做{
让jsonResults=try JSONSerialization.jsonObject(使用:data!,选项:.mutableContainers)作为!NSDictionary
让pokemonArray=jsonResults.value(forKey:results)作为![[String:Any]]
变量isPokemonsEqualsToQuantity:Bool=false
为pokemonArray中的Pokemonada{
如果让数量=数量{
守卫self.pokemons.count<其他数量{
isPokemonsEqualsToQuantity=true
打破
}
}
guard let name=pokemonda[“name”]as?字符串else{
返回
}
self.pokemon=pokemon(名称:name)
self.pokemons.append(self.pokemon)
}
guard let nextURL=jsonResults.value(forKey:“next”)作为?字符串,!isPokemonsEqualsToQuantity else{
用于self.pokemons中的口袋妖怪{
打印(pokemon.name)
}
打印(self.pokemons.count)
返回
}
self.loadPokemonsData(url:nextur,quantity:quantity)
}以讹传讹{
打印(错误本地化描述)
}
}
task.resume()
}
附加一个运行算法函数的屏幕。。。它可以打印791个口袋妖怪
希望它能帮助你
已编辑
下一次你要求输入密码时请。。。帮助你会更容易
- 我已经更新了代码来设置你想要的数量(如果你想得到所有的口袋妖怪,则为零),因此它只会按照API返回的顺序得到口袋妖怪,如果你想从所有的口袋妖怪中得到一个特定的口袋妖怪,你可以在得到所有的口袋妖怪后进行排序李>
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()
}
func loadPokemonsData(url:String,quantity:Int?){
let request=URLRequest(url:url(string:url)!)
让task=URLSession.shared.dataTask(with:request){(data,response,error)在
如果错误!=nil{
打印(错误!)
}
做{
让jsonResults=try JSONSerialization.jsonObject(使用:data!,选项:.mutableContainers)作为!NSDictionary
让pokemonArray=jsonResults.value(forKey:results)作为![[String:Any]]
变量isPokemonsEqualsToQuantity:Bool=false
为pokemonArray中的Pokemonada{
如果让数量=数量{
守卫self.pokemons.count<其他数量{
isPokemonsEqualsToQuantity=true
打破
}
}
guard let name=pokemonda[“name”]as?字符串else{
返回
}
self.pokemon=pokemon(名称:name)
self.pokemons.append(self.pokemon)
}
guard let nextURL=jsonResults.value(forKey:“next”)作为?字符串,!isPokemonsEqualsToQuantity else{
用于self.pokemons中的口袋妖怪{
打印(pokemon.name)
}
打印(self.pokemons.count)
返回
}
self.loadPokemonsData(url:nextur,quantity:quantity)
}以讹传讹{
打印(错误本地化描述)
}
}
task.resume()
}
附加一个运行算法函数的屏幕。。。它可以打印791个口袋妖怪
希望它能帮助你
已编辑
下一次你要求输入密码时请。。。帮助你会更容易
- 我已经更新了代码来设置你想要的数量(如果你想得到所有的口袋妖怪,则为零),因此它只会按照API返回的顺序得到口袋妖怪,如果你想从所有的口袋妖怪中得到一个特定的口袋妖怪,你可以在得到所有的口袋妖怪后进行排序李>