2017-05-25 44 views
-1

解析不起作用“for”当解析不起作用“for”

在什么地方会出现错误?

早些时候,该代码这样的JSON的工作,但是当我改变JSON “为” 停止工作 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) 
     } 

这是我目前的JSON

enter image description here

+0

在第二JSON,'JSON [” LIBRARY“]'不是一个字典数组。这是一个字典。所以你不能这样做? [[String:Any]]'。它应该是'as? [字符串:任何]'。 – Larme

+0

@Larme所以它输出一个错误info.name = data [“NAME”]为?字符串类型'(键:字符串,值:任何)'没有下标成员 – programmer

+0

@programmer我指的是第一个问题。你误解了你的JSON格式。在发布的代码中,你的问题甚至没有通过for循环,我猜如果你在'json [“LIBRARY”]的'if let'之后添加'print()',它甚至不会被打印。所以,既然结构发生了变化,那也意味着其余的。你不能像数组一样解析字典。其余的由你决定。 – Larme

回答

2

库密钥包含字典不数组和字典的每个关键字都包含值作为dictioanry,所以就这样做吧。

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

注:从你JSON响应它看起来像IDNumberString如果这info.id = data["ID"] as? String工作,那么它肯定号将其转换为Int

+0

它适合我。谢谢 – programmer

+0

@programmer欢迎伴侣:) –

0

你有另一标签“库”,这是“47234”,则需要先分析数据这个标签后,就可以使用这个代码

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) 

      } 
     }