提问人:bumblebee 提问时间:9/19/2023 最后编辑:Brian Tompsett - 汤莱恩bumblebee 更新时间:11/22/2023 访问量:40
如何将 json 字典解码为我想要的结构并使用该数据填充我的表视图
How do I decode json Dictionary into a struct that I want and use that data to populate my Table View
问:
我有一个数据模型,它是一个结构体,我有一个具有 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 的初学者。
答:
0赞
Shabnam Siddiqui
11/22/2023
#1
起初我试图将其解析为数组,但它没有加载任何内容。请随时提出改进建议,因为我是学习 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
}
评论
userDataFromApi
reloadData()
userDataFromApi
.responseDecodable(of:)
.response()
cell.txtLabel.text = UserArr[indexPath.row]. first_name
这将打印名字。.休息吧,你随心所欲地处理......print(error)