将 json 数据提取到 swift 中的表视图 5

fetch json data to tableview in swift 5

我正在尝试从 json 中的 php 文件中获取数据到 swift 中的表格视图 5 我能够将控制台中的数据作为 json 数组获取, 我想要的是将数据提取到我的自定义单元格中,但我没有得到 json 数据数组键,例如数据 ["user_id"] 它没有加载任何东西

my json data one array sample

     func getUsers() {
        
        AF.request(SiteUrl).validate().responseJSON { response in
                switch response.result {
                case .success:
                    print("Validation Successful)")

                    if let json = response.data {
                        do{
                            let data = try JSON(data: json)
                            let str = data
                            print("DATA PARSED: \(str)")
                        }
                        catch{
                        print("JSON Error")
                        }

                    }
                case .failure(let error):
                    print(error)
                }
            }
        
     }
    
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
        
   }

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let customCell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell
       let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
       cell.textLabel?.text =  "Hi Hadi"
        
        //customCell.AdTitle.text =

       return customCell
   }
    

首先强烈建议放弃 SwiftyJSON 以支持 Codable

尽管如此,只需创建一个数据源数组,将接收到的数据分配给数据源数组并重新加载 table 视图。 In cellForRow 从数组中获取项目并将值分配给相应的 UI 元素

var data = [JSON]()

func getUsers() {
    
    AF.request(SiteUrl).validate().responseJSON { response in
            switch response.result {
            case .success:
                print("Validation Successful)")

                if let json = response.data {
                    do{
                        let jsonData = try JSON(data: json)
                        self.data = jsonData.arrayValue
                        self.tableView.reloadData() // we are already on the main thread
                        print("DATA PARSED: \(jsonData)")
                    }
                    catch {
                        print("JSON Error", error)
                    }
                }
            case .failure(let error):
                print(error)
            }
        }
    
 }

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return data.count        
 }

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   // let customCell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell
   let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
   let item = data[indexPath.row]
   cell.textLabel?.text = item["user_id"].string
   return cell
}
   

这是现代的方式,首先创建一个结构(你必须根据 JSON 添加其他成员并使用驼峰命名:"user_id" -> userId

struct User : Decodable {
    let id, contactName : String
    let userId : String
}

并将上面的其他代码替换为

var users = [User]()

func getUsers() {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    AF.request(SiteUrl).validate().responseDecodable(decoder: decoder) { (response : DataResponse<[User],AFError>) in
        switch response.result {
            case .success(let result): 
                print("Validation Successful)")
                self.users = result
                self.tableView.reloadData()
            case .failure(let error): print("JSON Error", error)
        }    
    }
 }

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return users.count        
 }

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   // let customCell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell
   let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
   let user = users[indexPath.row]
   cell.textLabel?.text = user.userId
   return cell
}