2017-12-18 247 views
0

这里我试图解析来自本地服务器的数据,但无法解析它,它返回的是空数据,下面是我的模型类,从中我传递给表视图的数据,任何人都可以帮助我实现它?无法在swift 3中解析Json?

在这里,我曾附我的图像下面的JSON格式: enter image description here

代码:

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

后的实际JSON,而不是图像的必要性。 – ryantxr

+0

我的Json是本地服务器的网址,如果我发帖也无法访问@ryantxr – User

+0

你在这个jsonObj中得到了什么结果? –

回答

0

JSON的根是数组,然后第二级是字典连键list1list2等你在你的代码中缺少这个。应该是这样的(我没有编译它)。

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

} 

还有很多其他的问题,在你的代码。像力量解包可选。在范围内再次使用相同的参数。例如。

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

就像你正在使用dict它隐藏外dict的范围,则不应该使用相同的名称PARAM。

0

刚刚尝试的代码

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

这些线并没有使可选初始化为HomeBannerChildrenBanners只使用init(json : [String : Any]){}两种结构