2016-09-14 4 views
4

Я пытаюсь заполнить таблицу, заполнив массив из данных JSON. Я использую ниже код, но получаю ошибку:Сериализация JSON с Swift 3

Type 'Any' has no subscript members

на следующие строки кода:

self.tableData.append(jsonResult[i]["title"]! as! String) 
self.tableImages.append(jsonResult[i]["image"]! as! String) 
self.tableDesc.append(jsonResult[i]["description"]! as! String) 
self.tableValidity.append(jsonResult[i]["validity"]! as! String) 

Мой код:

let str3 = Int(str2!)! 
      let url = NSURL(string: "https://www.*****.php")! 

      let task = URLSession.shared.dataTask(with: url as URL) { (data, response, error) -> Void in 
       if let urlContent = data { 
        do { 

         let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) 


         print(str3) 

         var i = 0 

         while i < str3 { 
          print(jsonResult[i]["title"]! as!String) 
          print(jsonResult[i]["image"]! as! String) 

          self.tableData.append(jsonResult[i]["title"]! as! String) 
          self.tableImages.append(jsonResult[i]["image"]! as! String) 
          self.tableDesc.append(jsonResult[i]["description"]! as! String) 
          self.tableValidity.append(jsonResult[i]["validity"]! as! String) 

          i = i + 1 

         } 

        } catch { 
         print("JSON serialization failed") 
        }      

       } else {      
        print("ERROR FOUND HERE") 
       }     

       DispatchQueue.main.async(execute: {() -> Void in 

        self.tableView.reloadData() 

       })         

      } 

      task.resume() 
+1

Вы видели эту недавнюю запись в блоге: https://developer.apple.com/swift/blog/?id=37? – Koen

ответ

4

Компилятор не знает тип jsonResult, вы должны сказать, что это такое, например, с дополнительным связыванием следующим образом:

if let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: []) as? [[String:AnyObject]] { 


} 

Здесь я опускаю JSON в виде массива словарей. Используйте свою петлю внутри этого if let, и он должен работать.

4

компилятор не знает тип объекта JSON, вам нужно привести его к фактическому типу

let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options:[]) as! [[String:Any]] 

Mutable контейнеры не нужны вообще.

Цикл C- while с приращением счетчика очень уродлив. Не используйте это в Swift. И вы используете слишком много восклицательных знаков

for item in jsonResult { 

    print(item["title"] as! String) 
    print(item["image"] as! String) 

    self.tableData.append(item["title"] as! String) 
    self.tableImages.append(item["image"] as! String) 
    self.tableDesc.append(item["description"] as! String) 
    self.tableValidity.append(item["validity"] as! String) 

} 

PS: И несколько массивов в качестве источника данных также неуклюжим и подверженным ошибкам. На объектно-ориентированном языке предпочтительна настраиваемая структура или класс

Смежные вопросы