2017-12-18 5 views
0

Hier habe ich versucht, die Daten von meinem lokalen Server zu analysieren, aber nicht analysieren und leere Daten zurückgeben und unten sind meine Modellklassen, von denen die Daten ich zu einer Tabellenansicht übergeben, die mir helfen kann, was falsch bei der Implementierung ist ?Kann Json in swift 3 nicht analysieren?

Hier hatte ich mein Bild angehängt, die das JSON-Format folgt: enter image description here

Code:

var homePageModel = [HomeBanner]() 

func HomeBannerDownloadJsonWithURL(){ 
     let url = URL(string: homePageUrl)! 
     let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
      if error != nil { print(error!); return } 
      do { 
       if let jsonObj = try JSONSerialization.jsonObject(with: data!) as? [[String:Any]] { 
        for item in jsonObj { 
         print(item) 
         for dict in item { 
          print(dict) 
          let dict = HomeBanner(json: item) 
          self.homePageModel.append(dict!) 
          print(self.homePageModel) 
         } 
        } 
        print(self.homePageModel) 
        DispatchQueue.main.async { 
         self.homeTableView.delegate = self 
         self.homeTableView.dataSource = self 
         self.homeTableView.reloadData() 
        } 
       } 
      } catch { 
       print(error) 
      } 
     } 
     task.resume() 
    } 
    struct HomeBanner { 

    let title : String? 
    let titleInArabic : String? 
    let showTitle : String? 
    var banner = [ChildrenBanners]() 

    init?(json : [String:Any]) { 
     if let customAttribute = json["childran_banners"] as? [[String: AnyObject]] { 
       var result = [ChildrenBanners]() 
       for obj in customAttribute { 
        result.append(ChildrenBanners(json: obj as! [String : String])!) 
       } 
       self.banner = result 
       } else { 
        self.banner = [ChildrenBanners]() 
       } 
     self.title = json["title"] as? String ?? "" 
     print(self.title) 
     self.titleInArabic = json["title_in_arabic"] as? String ?? "" 
     self.showTitle = json["show_title"] as? String ?? "" 
    } 
} 

struct ChildrenBanners { 

    let bannerId : String? 
    let name : String? 
    let status : String? 
    let sliderId : String? 
    let desktopImage : String? 
    let mobileImage : String? 
    let imageAlt : String? 
    let sortOrder : String? 
    let startTime : String? 
    let endTime : String? 

    init?(json : [String:Any]) { 

     self.bannerId = json["banner_id"] as? String ?? "" 
     print(self.bannerId) 
     self.name = json["name"] as? String ?? "" 
     self.status = json["status"] as? String ?? "" 
     self.sliderId = json["slider_id"] as? String ?? "" 
     self.desktopImage = json["desktop_image"] as? String ?? "" 
     self.mobileImage = json["mobile_image"] as? String ?? "" 
     self.imageAlt = json["image_alt"] as? String ?? "" 
     self.sortOrder = json["sort_order"] as? String ?? "" 
     self.startTime = json["start_time"] as? String ?? "" 
     self.endTime = json["end_time"] as? String ?? "" 

    } 

} 
+0

Beitrag die tatsächliche JSON, kein Bild verwenden. – ryantxr

+0

Mein JSON ist lokale Server-URL, in der, wenn ich auch posten Sie können @Ryantxr – User

+0

nicht zugreifen, was Ergebnis erhalten Sie in diesem JsonObj? –

Antwort

0

Root of json ein Array und dann die zweite Ebene ist Wörterbuch mit Tasten list1, list2 usw. Sie vermissen das in Ihrem Code. Sollte so etwas sein (ich habe es nicht zusammengestellt).

if let data = data, let jsonObj = try JSONSerialization.jsonObject(with: data) as? [[String:[String:Any]]] { 
    for item in jsonObj { 
     for (_, dict) in item { 
      if let obj = HomeBanner(json: dict) { 
       self.homePageModel.append(obj) 
      } 
     } 
    } 

} 

Es gibt viele andere Probleme in Ihrem Code. Wie Kraftentpacken optional. Verwenden Sie dieselben Parameter erneut in einem Bereich. Beispielsweise.

for dict in item {        
    let dict = HomeBanner(json: item) 
    // .... 
} 

Sie sollten nicht denselben param Namen verwenden wie Sie dict verwenden es versteckt den Umfang des äußeren dict.

0

versuchen Sie einfach diese Zeilen Code

  if let jsonObj = try JSONSerialization.jsonObject(with: data!) as? [[String:Any]] { 
       self.homePageModel = jsonObj.map{HomeBanner(json: $0)} 


       print(self.homePageModel) 
       DispatchQueue.main.async { 
        self.homeTableView.delegate = self 
        self.homeTableView.dataSource = self 
        self.homeTableView.reloadData() 
       } 
      } 
     } catch { 
      print(error) 
     } 

und es gibt keine Notwendigkeit für HomeBanner optional initializer machen und ChildrenBanners nur init(json : [String : Any]){} für beide struct