Показать всю информацию о данных JSON в массиве - PullRequest
0 голосов
/ 01 октября 2018

привет, у меня есть проблема. Я поправляю json-файл в 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

, но я не могу отобразить всю информацию о пользователе (имя, фамилия ..). Это код, который я реализовал.для отображения всей пользовательской информации

   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()

но он просто отображает цикл с первой пользовательской информацией, как восстановить всех пользователей ??помогите мне пожалуйста

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

вместо этих двух строк

    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))
     }

используйте их:

    for dic in jsonArray {
        model.append(Beneficiary(dic))
        cellModelArray.append(HPBeneficiaryModel(firstName: dic.firstName, lastName: dic.lastName, tel: dic.beneficiaryNumber, type: .beneficiary))
    }

У вас уже есть объект "dic" для каждого цикла, который делает цикл.Однако вы продолжаете обращаться к первому элементу модели model[0], который получает один и тот же объект независимо от текущего цикла.

Я бы посоветовал вам также использовать Codable для разбора вашего JSON.Это намного проще и довольно просто.Вот хороший учебник: https://medium.com/xcblog/painless-json-parsing-with-swift-codable-2c0beaeb21c1

0 голосов
/ 01 октября 2018

Непосредственной проблемой является следующая строка:

cellModelArray.append(HPBeneficiaryModel(firstName: model[0].firstName, lastName: model[0].lastName, tel: model[0].beneficiaryNumber, type: .beneficiary))

Вы всегда получаете доступ к первому элементу массива model при добавлении новых элементов в конец массива.Вам нужно использовать model.last! вместо model[0].

Однако вам следует переключиться на использование Codable вместо ручного анализа JSON-ответа.

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"
    }
}

Затем создайте сетьзапрос:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...