2017-01-25 4 views
-3

Я хочу показать свои данные в tableview, у меня есть данные json, и я просмотрел этот tutorial. Он работает, но у моих json-данных нет ключа массива «actor». Это пример json-данных.Загрузка JSON в Table View в Swift 3

{ 
    "actors": [ 
    { 
     "name": "Brad Pitt", 
     "description": "William Bradley 'Brad' Pitt is an American actor and film producer. He has received a Golden Globe Award, a Screen Actors Guild Award, and three Academy Award nominations in acting categories", 
     "dob": "December 18, 1963", 
     "country": "United States", 
     "height": "1.80 m", 
     "spouse": "Jennifer Aniston", 
     "children": "Shiloh Nouvel Jolie-Pitt, Maddox Chivan Jolie-Pitt", 
     "image": "http://microblogging.wingnity.com/JSONParsingTutorial/brad.jpg" 
    }, 
    { 
     "name": "Tom Cruise", 
     "description": "Tom Cruise, is an American film actor and producer. He has been nominated for three Academy Awards and has won three Golden Globe Awards. He started his career at age 19 in the 1981 film Endless Love.", 
     "dob": "July 3, 1962", 
     "country": "United States", 
     "height": "1.70 m", 
     "spouse": "Katie Holmes", 
     "children": "Suri Cruise, Isabella Jane Cruise, Connor Cruise", 
     "image": "http://microblogging.wingnity.com/JSONParsingTutorial/cruise.jpg" 
    } 
    ] 
} 

это мои данные json.

и это мой код;

func downloadJsonWithURL() { 

    let url = NSURL(string: urlString) 
    URLSession.shared.dataTask(with: (url as? URL)!, completionHandler: {(data, response, error) -> Void in 

     if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary { 
      print(jsonObj!.value(forKey: "actors")) 

      if let studentArray = jsonObj!.value(forKey: "actors") as? NSArray { 
       for student in studentArray{ 
        if let studentDict = student as? NSDictionary { 

         if let name = studentDict.value(forKey: "ID") { 
          self.noArray.append(name as! String) 
         } 
         if let name = studentDict.value(forKey: "name") { 
          self.adiArray.append(name as! String) 
         } 
        } 
       } 
      } 

      OperationQueue.main.addOperation({ 
       self.tableView.reloadData() 
      }) 
     } 
    }).resume() 
} 

У меня проблема здесь; enter image description here

и это будет проблема:/

 // my json data doesnt have "actors" ????? 
     print(jsonObj!.value(forKey: "actors")) 
     if let studentArray = jsonObj!.value(forKey: "actors") as? NSArray { 
      for student in studentArray{ 
       if let studentDict = student as? NSDictionary { 
+0

Не заставляйте unwrap'! ' –

ответ

1

Я исправил проблему .. я случайно линия jsonObj и закрыл линию актера

это;

if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSArray {} 

и это

if let actorArray = jsonObj!.value(forKey: "actors") as? NSArray { 
        for student in jsonObj!{ 
         if let studentDict = student as? NSDictionary { 
         } 
        } 
+1

Там нет ничего, как актеры в вашем формате JSON, то, как вы работаете с ним, в вашем вопросе вы сказали, что актеры это с Учебник JSON, это не имеет никакого смысла. Также в Swift вам нужно использовать собственный массив и словарь, как и мой [ответ] (http://stackoverflow.com/a/41853675/6433023) –

1

Ваш ответ JSON имеет Array типа не Dictionary. В Swift используйте собственный массив вместо NSArray. Таким образом, вам нужно напечатать jsonObject результат [[String:Any]].

if let array = (try? JSONSerialization.jsonObject(with: data!, options: [])) as? [[String:Any]] { 
    //Now loop through the array. 
    for item in array { 
     if let id = item["ID"] as? Int { 
      self.noArray.append("\(id)") 
     } 
     if let name = item["name"] as? String { 
      self.adiArray.append(name) 
     } 
    } 
    DispatchQueue.main.async { 
     self.tableView.reloadData() 
    } 

} 

Примечание: Вместо того, чтобы использовать несколько массив, необходимо использовать единый массив пользовательских объектов или словаря, так долбить, если вы создаете один пользовательский класс и сделал массив его или использовать массив словаря.

0

Я рекомендую использовать SwiftyJSON: https://github.com/SwiftyJSON/SwiftyJSON. Easy Instal с cocoapods: под

import SwiftyJSON 

URLSession.shared.dataTask(with: URL(string: "asd")!, completionHandler: {(data, response, error) in 

      guard error == nil else { 

       print("there is an error \(error)") 
       return 
      } 

      guard data != nil else { 

       print("there is no data") 
       return 
      } 

      let json = JSON(data: data) 

      for actor in json["actors"].array { 

       self.noArray.append(actor["ID"].int) 
       self.adiArray.append(actor["name"].string) 
      } 

      DispatchQueue.main.async { 

       self.tableView.reloadData() 
      } 

     }).resume() 
0

Первый JSON «SwiftyJSON» имеют корневой элемент словарь поэтому ваш код работает для первого формата JSON. Но второй JSON, что вы хотите, чтобы разобрать, имеющий корень elemt является массив, и вы пытаетесь присвоить массив в словаре, поэтому вы получаешь ошибку Так просто заменить код с ..

if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options:[]) as? NSArray 
0

Изменить

as! NSDictionary 

Для

as! [String : Any]