如何将 json 字典解码为我想要的结构并使用该数据填充我的表视图

问题描述 投票:0回答:1

我有一个结构体数据模型,还有一个包含 JSON 字典的 API。我需要用字典中的值填充表视图单元格。我已经创建了一个包含键值的数组,以将其传递给视图控制器中的标签之一。我有一个文本字段和一个标签,我希望 API 中的数据与包含键的数组中的数组元素相对应地显示。

这是我的视图控制器[已编辑];

import UIKit

class FirstViewController: UIViewController {
    
    
    @IBOutlet weak var DataTable: UITableView!
    
    var UserArr = ["ID", "UID", "Password", "First Name", "Last Name", "Username", "Email", "Avatar", "Gender", "Phone Number", "Social Insurance Number", "Date Of Birth", "Employment", "Address", "Zip Code", "State", "Country", "Coordinates", "CC Number", "Subscription"]
    
    var userDataFromApi = [UserData]()
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        NetworkManager.sharedInstance.fetchData{
            apiData in
            self.userDataFromApi = apiData
            DispatchQueue.main.async { [self] in
                DataTable.reloadData()
            }
        }
        
        DataTable.dataSource = self
        DataTable.delegate = self
                       
        
    }
            
}

extension FirstViewController : UITableViewDelegate,UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return userDataFromApi.count
    }
   
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = DataTable.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DataTableViewCell
        
        let rowdata = userDataFromApi[indexPath.row]
        cell.txtLabel.text = UserArr[indexPath.row]
        cell.txtField.text = rowdata.first_name
        return cell
    }
    
    
}

我的数据模型

import Foundation

struct UserData : Codable {        
    let id : Int
    let uid : String
    let password : String
    let first_name : String
    let last_name : String
    let username : String
    let email : String
    let avatar : String
    let gender : String
    let phone_number : String
    let social_insurance_number : String
    let date_of_birth : String
    let employment : Employment
    
    
    struct Employment : Codable {
        let title : String
        let key_skill: String
    }
    
    
    let address : Address
    struct Address : Codable {
        let city : String
        let street_name : String
        let street_address : String
        let zip_code : String
        let state : String
        let country : String
        let coordinates : Coordinates
        struct Coordinates : Codable {
            let lat : Double
            let lng : Double
        }
    }
    
    
    let credit_card : Credit_card
    struct Credit_card : Codable {
        let cc_number : String
    }
    
    let subscription : Subscription?
    struct Subscription : Codable {
        let plan : String
        let status : String
        let payment_method : String
        let term : String
    }
            
}

我在哪里发出 API 请求

import Foundation
import Alamofire

class NetworkManager {
    static let sharedInstance = NetworkManager()
    private init() {
        
    }
    
    func fetchData(handler: @escaping (_ apiData :[UserData]) -> (Void)){
        guard let url = URL(string: "https://random-data-api.com/api/v2/users")
        else {
            return
            
        }
        AF.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil, interceptor: nil) .response  { resp in
            switch resp.result {
            case  .success(let data) :
                do {
                    let json = try JSONDecoder().decode([UserData].self, from: data!)
                    print("Data is : \(json)")
                    print(type(of: json))
                    handler(json)
                }
                catch{
                    print(error)
                }
            case .failure(let error) :
                print(error.localizedDescription)
            }
                                                
        }
    }
                
}

起初我尝试将其解析为数组,但它没有加载任何内容。请随时提出改进建议,因为我是学习 Swift 的初学者。

swift uikit alamofire jsonparser
1个回答
0
投票

起初我尝试将其解析为数组,但它没有加载任何内容。请随时提出改进建议,因为我是学习 Swift 的初学者。

这是因为你从你的API中获取了字典并且你试图将它存储在数组中。

你需要稍微改变一下你的api调用函数。

func fetchData(handler: @escaping (_ apiData :UserData) -> (Void)){
        guard let url = URL(string: "https://random-data-api.com/api/v2/users")
        else {
            return
            
        }
        AF.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil, interceptor: nil) .response  { resp in
            switch resp.result {
            case  .success(let data) :
                do {
                    let json = try JSONDecoder().decode(UserData.self, from: data!)
                    print("Data is : \(json)")
                    print(type(of: json))
                    handler(json)
                }
                catch{
                    print(error)
                }
            case .failure(let error) :
                print(error.localizedDescription)
            }
            
        }
    }
NetworkManager.sharedInstance.fetchData{
    apiData in
    print("api data - ",apiData)
    // you can save your data in array accordingly
}
© www.soinside.com 2019 - 2024. All rights reserved.