1
votes

API iTunes - Erreur de tableau JSON Swift4, Req. à afficher dans la vue Collection sous forme de tableau

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 commentaires

Quelle erreur obtenez-vous? Vous ne devez pas utiliser NSArray dans Swift. comme! anyHashable as! NSArray est particulièrement moche. Depuis votre JSON, vous pouvez voir que la racine n'est pas un tableau, c'est un dictionnaire. La clé results de ce dictionnaire est un tableau. Je vous suggère fortement de regarder Codable pour analyser votre JSON


Comme 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/search avec Decodable


3 Réponses :


0
votes

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
    }


0 commentaires

0
votes

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!


2 commentaires

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/...



0
votes

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()
    }


3 commentaires

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