2017-05-25 2 views
-1

Lorsque l'analyse ne fonctionne pas "pour"Lorsque l'analyse ne fonctionne pas "pour"

En quoi peut-il y avoir une erreur?

Plus tôt ce code a travaillé avec un tel JSON, mais quand je l'ai changé JSON "pour" a cessé de travailler enter image description here

do{ 
      let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String : Any] 

      if let main = json["LIBRARY"] as? [[String : Any]]{ 

       for data in main { 
        var info = Modal() 
        info.name = data["NAME"] as? String 
        info.id = data["ID"] as? String 
        info.ImageViewURL = data["PICTURE"] as! String 
        print(info.id) 

        if let filesArray = data["FILES"] as? [[String : Any]] { 
         for file in filesArray { 
          var info = Modal() 
          info.name = file["NAME"] as? String 
          info.audioUrl = file["SRC"] as? String 

          print(info.name! as Any) 
          print(info.audioUrl! as Any, "\n") 

          self.modals.append(info) 
         } 

        } 

        print(info.name) 

        self.modals.append(info) 

       } 
      } 

     } catch let error { 
      print(error) 
     } 

Voici mon JSON actuel

enter image description here

+0

Dans la deuxième JSON, 'JSON [ » LIBRARY "]' n'est pas un tableau de dictionnaires. C'est un dict. Donc vous ne pouvez pas faire comme? [[String: Any]] '. Cela devrait être 'comme? [Chaîne: Tout] '. – Larme

+0

@Larme Donc, il génère une erreur info.name = data ["NAME"] comme? String Type '(key: String, value: Any)' n'a aucun membre en indice – programmer

+0

@programmer Je pointais le premier numéro. Vous avez mal interprété le format de votre JSON. Dans le code posté, votre problème ne passait même pas la boucle for, je suppose que si vous ajoutez un 'print()' après le 'if let' de' json ["LIBRARY"] 'il ne serait même pas imprimé . Donc, puisque la structure a changé, cela aurait signifié que le reste aussi. Vous ne pouvez pas analyser un dictionnaire exactement comme un tableau. Le reste était à vous. – Larme

Répondre

2

clé Library contient le dictionnaire non array et chaque clé du dictionnaire contient aussi de la valeur comme dictioanry, alors fais comme ça.

if let main = json["LIBRARY"] as? [String:[String : Any]]{ 
    //Now loop though the dictionary 
    for (_, data) in main { 
     //Now access data dictionary same way you are accessing previously 
     var info = Modal() 
     info.name = data["NAME"] as? String 
     info.id = data["ID"] as? String 
     info.ImageViewURL = data["PICTURE"] as! String 
     print(info.id) 

     if let filesArray = data["FILES"] as? [[String : Any]] { 
      for file in filesArray { 
       var info = Modal() 
       info.name = file["NAME"] as? String 
       info.audioUrl = file["SRC"] as? String 
       print(info.name! as Any) 
       print(info.audioUrl! as Any, "\n") 
       self.modals.append(info) 
      } 
     } 
     print(info.name) 
     self.modals.append(info) 
    } 
} 

Note: De votre réponse JSON il ressemble que ID est Number pas String si ce travail info.id = data["ID"] as? String alors son numéro que jeter aux Int.

+0

c'est du travail pour moi. merci – programmer

+0

@programmeur Bienvenue mec :) –

0

-vous une autre étiquette après « bibliothèque » qui est « 47234 », vous devez d'abord analyser les données de cette balise, vous pouvez appliquer ce code

for data in main { 
       var info = Modal() 
       info.name = data["NAME"] as? String 
       info.id = data["ID"] as? String 
       info.ImageViewURL = data["PICTURE"] as! String 
       print(info.id) 

       if let filesArray = data["FILES"] as? [[String : Any]] { 
        for file in filesArray { 
         var info = Modal() 
         info.name = file["NAME"] as? String 
         info.audioUrl = file["SRC"] as? String 

         print(info.name! as Any) 
         print(info.audioUrl! as Any, "\n") 

         self.modals.append(info) 
        } 

       } 

       print(info.name) 

       self.modals.append(info) 

      } 
     }