使用 SwiftJSON 将 Alamofire 结果 JSON 加载到表视图中

Posted

技术标签:

【中文标题】使用 SwiftJSON 将 Alamofire 结果 JSON 加载到表视图中【英文标题】:Load Alamofire result JSON into table view using SwiftJSON 【发布时间】:2019-09-12 17:11:52 【问题描述】:

我正在尝试使用从 Web API 检索到的 JSON 数据填充 tableview。

我的用户模型有一个类:

class UserModel 
    var userID: String?
    var fullName: String?
    var emailAddr: String?

    init(userID: String?, fullName: String?, emailAddr: String?) 
        self.userID = userID
        self.fullName = fullName
        self.emailAddr = emailAddr
    

我正在尝试填充:

func getUserList()        
    Alamofire.request("myURL here")
        .responseJSON(completionHandler:  (response) in
            switch response.result 
            case .success(let value):
                ProgressHUD.dismiss()
                let json = JSON(value)
                print(json)

                for (_, _) in json 
                    let user = UserModel(userID: "userID", fullName: "fullName", emailAddr: "email")

                    self.users.append(user)
                
                self.tableView.reloadData()

                ProgressHUD.dismiss()
            case .failure(let error):
                print(error.localizedDescription)
            
        )

print(json) 的输出为:

["userID":"bbloggs","fullName":"Billy Bloggs","email":"bbloggs@bloggs.com","userID":"bnomates","fullName":"Billy Nomates", “电子邮件”:“bnomates@something.org”]

代码没有进入'for'块,直接跳转到self.tableView.reloadData这一行。

【问题讨论】:

【参考方案1】:

其实你不需要 SwiftyJSON 转换,因为结果已经是一个数组

guard let userArray = value as? [[String:String]] else  return 
for item in userArray 
    let user = UserModel(userID: item["userID"]!, 
                         fullName: item["fullName"]!, 
                         emailAddr: item["email"]!)
    self.users.append(user)


但是,我们鼓励您放弃SwiftyJSON 并使用Decodable。它更高效,需要更少的代码

struct User 
    let userID, fullName, emailAddr: String


func getUserList()         
    Alamofire.request("myURL here")
        .responseData(completionHandler:  (response) in // responseData is crucial
            switch response.result 
            case .success(let data):
                ProgressHUD.dismiss()
                do 
                   self.users = try JSONDecoder().decode([User].self, from: data)
                 catch  print(error) 
                self.tableView.reloadData()

                ProgressHUD.dismiss()
            case .failure(let error):
                print(error.localizedDescription)
            
        )

【讨论】:

【参考方案2】:

您可以将结果转换为“字典数组”,然后创建对象。 像这样的:

func getUserList()
    Alamofire.request("myURL here")
        .responseJSON(completionHandler:  (response) in
            switch response.result 
            case .success(let value):
                ProgressHUD.dismiss()
                let json = JSON(value)
                print(json)

                if let jsonArray = json as? [[String: Any]] 
                    let user = UserModel(userID: "userID", fullName: "fullName", emailAddr: "email")
                    self.users.append(user)
                
                self.tableView.reloadData()

                ProgressHUD.dismiss()
            case .failure(let error):
                print(error.localizedDescription)
            
        )

【讨论】:

以上是关于使用 SwiftJSON 将 Alamofire 结果 JSON 加载到表视图中的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire中的responseJSON json解析

TableviewCell 中的 CollectionView :使用 Alamofire 和 SwiftyJSON 和 MVC 模型显示数据

尝试使用 swiftJson 解析 json 数组

SwiftJson的使用

使用 Alamofire 将 JSON 解码为对象

使用 Alamofire 将对象作为参数发送