Ma réponse json est,
Alamofire.request("https://itunes.apple.com/search?term=jackjohnson&entity=musicVideo").responseJSON { response in
debugPrint(response)
if let json = response.result.value //getting json
{
print(json)
let jobsArray : NSArray = json as! AnyHashable as! NSArray //converting json to NSArray
if jobsArray.count > 0
{
for object in jobsArray
{
if let singleDict = object as? NSDictionary
{
self.arrFavAdsList.add(singleDict)
print(self.arrFavAdsList)
}
}
DispatchQueue.main.async() {
self.collectionView.reloadData()
}
//displaying data in tableview
}
}
}
J'ai écrit du code pour le chargement de la vue pour appeler la méthode get,
{ resultCount = 32;
results = (
{
artistId = 909253;
artistName = "Jack Johnson";
country = USA;
currency = USD;
kind = "music-video";
},
{
artistId = 909253;
artistName = "Jack Johnson";
country = UK;
currency = USD;
kind = "music-video";
}
Mais cela s'affiche json array error .. Je dois obtenir la réponse du tableau sous forme de dictionnaire et l'afficher dans ma vue de collection
3 Réponses :
Votre contenu JSON complet est le dictionnaire, vous devez donc convertir la première chaîne JSON en dictionnaire, utiliser le code suivant pour convertir JSON en dictionnaire, puis extraire le tableau de résultats du dictionnaire et le charger dans votre UICollectionview code> func convertToDictionary(text: String) -> [String: Any]? {
if let data = text.data(using: .utf8) {
do {
return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
} catch {
print(error.localizedDescription)
}
}
return nil
}
Le contenu de votre JSON est un dictionnaire et vous ne pouvez pas le convertir de cette façon. Voici une version de travail:
struct APIResult: Codable {
struct Track: Codable {
let kind: String
let artistName: String
let name: String
enum CodingKeys : String, CodingKey {
case kind
case artistName
case name = "trackName"
}
}
let resultCount: Int
let tracks: [Track]
enum CodingKeys : String, CodingKey {
case resultCount
case tracks = "results"
}
}
// and then use it like following:
Alamofire.request("https://itunes.apple.com/search?term=jackjohnson&entity=musicVideo").response { response in
let decoder = JSONDecoder()
let tracks = try! decoder.decode(APIResult.self, from: response.data!).tracks
for track in tracks {
// do your stuffs with track here.
}
}
Cependant, je préfère que vous utilisiez Codable / Decodable pour analyser JSON dans Swift. Vous pouvez consulter l'exemple suivant pour référence:
Alamofire.request("https://itunes.apple.com/search?term=jackjohnson&entity=musicVideo").responseJSON { response in
if let json = response.result.value as? [String: Any], let tracks = json["results"] as? Array<[String: Any]>, tracks.count > 0 {
for track in tracks {
// do your stuffs with track here.
}
}
}
Bon codage!
Veuillez suggérer comment appeler la vue de collection recharger la liste des tableaux pour chaque
Je ne sais pas pourquoi vous voulez appeler la vue de collection recharger la liste des tableaux pour chaque car une fois que vous avez obtenu les résultats, toute la collection a changé, donc je pense que votre ancien code peut toujours être utilisé: self.collectionView.reloadData () , non ?. Quoi qu'il en soit, pour répondre à votre question, vérifions la méthode reloadItems (at :) de UICollectionView: developer.apple.com/documentation/uikit/uicollectionview/...
Tout d'abord, déclarez des variables dans votre contrôleur de vue ou ailleurs
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return mArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! Cell // your cell identifier..
cell.label1.text = mArray[indexPath.row].trackName
cell.label2.text = mArray[indexPath.row].trackId
cell.label3.text = mArray[indexPath.row].currency.
///////like so for other stuffs which u need to show in collection view.
}
return cell
}
Essayez d'utiliser l'analyse Json codable / décodable afin de récupérer ApiResults,
func callAPI() {
guard let url = URL(string: "https://itunes.apple.com/search?term=jackjohnson&entity=musicVideo") else {return}
URLSession.shared.dataTask(with: url){(data, response, error) in
guard let data = data else {return}
do
{
let apiressults = try JSONDecoder().decode(ApiResults.self, from: data)
for item in apiressults.results
{if let track_Name = item.trackName, let artist_Name = item.artistName, let country = item.country, let currency = item.currency, let kind = item.kind
{let musics = Music(artistId: artist_Id, artistName: artist_Name, country: country, currency: currency, kind: kind)
self.mArray = apiressults.results
}
}
DispatchQueue.main.async
{
self.collectionView.reloadData()
} }
catch let jsonError
{
print("Error:", jsonError)
}
}.resume()
}
Pourquoi cette danse facultative fastidieuse et la création d'instances de Musique à partir d'instances de Musique ? L'API de recherche iTunes envoie de manière fiable toutes les clés du dictionnaire Musique .
@vadian, veuillez-vous modifier toutes les clés du dictionnaire musical
@AzeemRiverswave Supprimez simplement tous les points d'interrogation dans Musique et remplacez l'intégralité de l'expression de l'élément dans apiressults.results {...} par self.mArray = apiressults.results
Quelle erreur obtenez-vous? Vous ne devez pas utiliser
NSArraydans Swift.comme! anyHashable as! NSArrayest particulièrement moche. Depuis votre JSON, vous pouvez voir que la racine n'est pas un tableau, c'est un dictionnaire. La cléresultsde ce dictionnaire est un tableau. Je vous suggère fortement de regarderCodablepour analyser votre JSONComme suggéré par @ Paulw11, vous pouvez utiliser Codable / Decodable pour analyser json, ou bien vous pouvez vous référer à stackoverflow.com/a/54651826/2323806 < / a>
Veuillez consulter stackoverflow.com/questions/52935997/ comment mettre à jour le tableau de la vie . Il y a un exemple comment analyser JSON à partir de
itunes.apple.com/searchavec Decodable