无法在swift 3中解析Json?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在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 ?? ""

    }

}
答案

试试这些代码行

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

另一答案

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

你不应该使用相同的param名称,就像你使用dict它隐藏外部dict的范围。

以上是关于无法在swift 3中解析Json?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 3 中使用 Alamofire 4 解析这个 json?

Swift json 解析错误:无法将 NSCFConstantString 类型的值转换为 NSArray

无法解析响应 alamofire swift 3

如何在 Swift 3 中解析来自 URL 的 JSON 数据

如何在 Swift 中解析 JSON 数组?

无法将 JSON 数据解析为 Swift