это моя модель. сайт quicktyper перевел мою модель
import Foundation
struct User: Codable {
let customerID, companyID: Int
let firstName, lastName, phone, email: String
let passwordHash, passwordSalt: JSONNull?
let isStatus: Bool
}
struct Data : Codable{
let custommodel : [User]
}
class JSONNull: Codable, Hashable {
public static func == (lhs: JSONNull, rhs: JSONNull) -> Bool {
return true
}
public var hashValue: Int {
return 0
}
public init() {}
public required init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
if !container.decodeNil() {
throw DecodingError.typeMismatch(JSONNull.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for JSONNull"))
}
}
public func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
try container.encodeNil()
}
}
это мой запрос API
import Foundation
enum Verierror: Error{
case noDatAvailable
case canNotProcessData
}
struct verirequest{
let resource : URL
//example url. this is not the truth
let resoucreString = ""
init() {
guard let resourceurll = URL(string: resoucreString) else {fatalError()}
self.resource = resourceurll
}
func getveri(completion: @escaping(Result<[User],Verierror>) -> Void){
let datatask = URLSession.shared.dataTask(with: resource) { data, _, _ in
print(String(data: data!, encoding: .utf8))
guard let jsondata = data else{
completion(.failure(.noDatAvailable))
return
}
do{
let decoder = JSONDecoder()
let veriresponse = try decoder.decode(Data.self, from: jsondata)
let details = veriresponse.custommodel
completion(.success(details))
}catch{
completion(.failure(.canNotProcessData))
}
}
datatask.resume()
}
}
Мои данные поступают из API, но мои данные не могут быть обработаны. Я получаю сообщение об ошибке "cannotprocessdata". Сначала я мог обработать, но теперь не могу.
Я перевел свою модель на quictyper.com. При этом на выходе получаю ошибку "Невозможно обработать данные".
В апи проблем нет, могу проверить в почтальоне. Может ли проблема быть в моей модели или где-то еще? пожалуйста, помогите мне
это мой контроллер представления
import UIKit
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
@IBOutlet weak var tableview: UITableView!
var listveri = [User]()
override func viewDidLoad() {
super.viewDidLoad()
tableview.dataSource = self
tableview.delegate = self
let verirequest = verirequest()
verirequest.getveri { [weak self] (result) in
switch result{
case.failure(let error):
print(error)
case.success(let data):
self?.listveri = data
DispatchQueue.main.async {
self?.tableview.reloadData()
}
}
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return listveri.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableview.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
cell.namelabel.text = listveri[indexPath.row].firstName
cell.surnamelabel.text = listveri[indexPath.row].lastName
cell.emaillabel.text = listveri[indexPath.row].email
return cell
}
}
покажите нам данные json, которые вы получаете с сервера, добавив: print(String(data: data, encoding: .utf8))
непосредственно перед guard let jsondata = ....
. PS: не используйте имя Data
для своей структуры, в Swift уже есть структура Data
, это может запутать компилятор.
скопируйте и вставьте эти данные json в: https://app.quicktype.io/
, а не в вашу quicktyper
вещь. И вы увидите, что вам нужно сделать.
Я уже купил его с этого сайта. но он не работает. моя модель взята выше
Я не понимаю. Я использую app.quicktype.io, но он не работает :( Я получаю ту же ошибку
ваш struct Data : Codable{ let custommodel : [User] }
неверен, смотрите мой ответ. Вам нужно использовать data
, а не custommodel
. quicktype
говорит вам об этом.
моя ошибка отлова = typeMismatch(apii.JSONNull, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "data", intValue: nil), _JSONKey(stringValue: "Index 2", intValue: 2), CodingKeys(stringValue : "passwordHash", intValue: nil)], debugDescription: "Неверный тип для JSONNull", baseError: nil))
Когда я экспортирую данные в quicktype, он дает мне приведенную выше модель.
Нет, не дает custommodel
попробуйте следующие структуры:
struct Response: Codable {
let data: [User] // <--- here
let message: String?
let success: Bool
}
struct User: Codable {
let customerID, companyID: Int
let firstName, lastName, phone, email: String
let passwordHash, passwordSalt: String?
let isStatus: Bool
}
и расшифруйте ответ сервера следующим образом:
let veriresponse = try decoder.decode(Response.self, from: jsondata)
да, я пытался, но получаю ту же ошибку = "cannotprocessdata"
моя ошибка отлова = typeMismatch(apii.JSONNull, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "data", intValue: nil), _JSONKey(stringValue: "Index 2", intValue: 2), CodingKeys(stringValue : "passwordHash", intValue: nil)], debugDescription: "Неверный тип для JSONNull", baseError: nil))
Замените JSONNull?
на String?
в Response
и User
. Обновил мой ответ.
Можете ли вы объяснить это? как это сработало
Все, что я сделал, это использовал quicktype
, здесь нет ничего волшебного. Вы не должны менять имена ключей, потому что это то, что заставляет все работать с данными json. Код (структуры) будет работать с JSONNull?
, но кажется, что его проще использовать String?
Если это ответ на ваш вопрос, не могли бы вы отметить его как правильный, с галочкой, спасибо.
Есть ли у вас образец/пример данных, возвращенных вашей конечной точкой? Вам также, вероятно, следует распечатать ошибку, которая была зафиксирована блоком
catch
.