I have a problem; I get well the JSON file in the API:
▿ 23 elements
▿ 0 : 10 elements
▿ 0 : 2 elements
- key : _id
- value : 5b9912774a324d25ac5b52d8
▿ 1 : 2 elements
- key : userid
- value : 5b76c507af724e6f7538f249
▿ 2 : 2 elements
- key : __v
- value : 0
▿ 3 : 2 elements
- key : internationalFormat
- value : +224 625 25 92 39
▿ 4 : 2 elements
- key : firstname
- value : toto
▿ 5 : 2 elements
- key : lastname
- value : tata
▿ 6 : 2 elements
- key : countryCode
- value : GN
▿ 7 : 2 elements
- key : nationalFormat
- value : 625 25 92 39
▿ 8 : 2 elements
- key : created_at
- value : 2018-09-12T13:19:51.794Z
▿ 9 : 2 elements
- key : beneficiarynumber
- value : +224625259239
but I can not display all the information of the user (firstname, lastname ..) this is the code I implemented to display all user information:
struct Beneficiary {
let id: Int
let firstName: String
let lastName: String
let beneficiaryNumber: String
init(_ json: [String: Any]) {
self.id = json["_id"] as? Int ?? 0
self.firstName = json["firstname"] as? String ?? ""
self.lastName = json["lastname"] as? String ?? ""
self.beneficiaryNumber = json["internationalFormat"] as? String ?? ""
}
}
class HPBeneficiaryViewController {
//// list beneficiary /////
let token = HPWSLoginManager.shared().saveSuccessResponse.token
let idUser = sub["_id"] as! String
let url = URL(string: "http://51.38.36.76:40/api/v1/beneficiaries/"+idUser)!
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.addValue("Bearer \(token!)", forHTTPHeaderField: "Authorization")
URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let dataResponse = data, error == nil else {
print(error?.localizedDescription ?? "Response Error")
return }
do {
let jsonResponse = try JSONSerialization.jsonObject(with: dataResponse, options: [])
// print(jsonResponse)
guard let jsonArray = jsonResponse as? [[String: Any]] else {
return
}
var model = [Beneficiary]()
for dic in jsonArray {
model.append(Beneficiary(dic))
cellModelArray.append(HPBeneficiaryModel(firstName: model[0].firstName, lastName: model[0].lastName, tel: model[0].beneficiaryNumber, type: .beneficiary))
}
}
let sectionModel = HPBeneficiarySectionModel(name: "Mes Beneficiaires", modelArray: cellModelArray)
self.sectionArray = [sectionModel]
} catch {
print("error serializing")
}
}.resume()
but it just displays a loop with the first user information how to recover all users? Help me please.
The immediate issue is this line:
cellModelArray.append(HPBeneficiaryModel(firstName: model[0].firstName, lastName: model[0].lastName, tel: model[0].beneficiaryNumber, type: .beneficiary))
You always access the first element of the model
array while adding new elements to the end of the array. You need to use model.last!
instead of model[0]
.
However, you should switch to using Codable
instead of manually parsing a JSON response.
struct Beneficiary: Codable {
let id: Int
let firstName: String
let lastName: String
let beneficiaryNumber: String
enum CodingKeys: String, CodingKey {
case id = "_id", firstName = "firstname", lastName = "lastname", beneficiaryNumber = "internationalFormat"
}
}
Then make the network request:
URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let dataResponse = data, error == nil else {
print(error?.localizedDescription ?? "Response Error")
return
}
do {
let model = try JSONDecoder().decode([Beneficiary].self, from: dataResponse)
cellModelArray.append(contentsOf: model.map({HPBeneficiaryModel(firstName: $0.firstName, lastName: $0.lastName, tel: $0.beneficiaryNumber, type: .beneficiary)}))
let sectionModel = HPBeneficiarySectionModel(name: "Mes Beneficiaires", modelArray: cellModelArray)
self.sectionArray = [sectionModel]
} catch {
print("error serializing")
}
}.resume()