Мои данные API не могут обрабатываться с помощью модели Swift

это моя модель. сайт 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
    }
    

  
 


}


Есть ли у вас образец/пример данных, возвращенных вашей конечной точкой? Вам также, вероятно, следует распечатать ошибку, которая была зафиксирована блоком catch.

MadProgrammer 18.03.2022 00:19

покажите нам данные json, которые вы получаете с сервера, добавив: print(String(data: data, encoding: .utf8)) непосредственно перед guard let jsondata = ..... PS: не используйте имя Data для своей структуры, в Swift уже есть структура Data, это может запутать компилятор.

workingdog support Ukraine 18.03.2022 00:21

скопируйте и вставьте эти данные json в: https://app.quicktype.io/, а не в вашу quicktyper вещь. И вы увидите, что вам нужно сделать.

workingdog support Ukraine 18.03.2022 00:50

Я уже купил его с этого сайта. но он не работает. моя модель взята выше

emir aksoydan 18.03.2022 00:53

Я не понимаю. Я использую app.quicktype.io, но он не работает :( Я получаю ту же ошибку

emir aksoydan 18.03.2022 01:06

ваш struct Data : Codable{ let custommodel : [User] } неверен, смотрите мой ответ. Вам нужно использовать data, а не custommodel. quicktype говорит вам об этом.

workingdog support Ukraine 18.03.2022 01:09

моя ошибка отлова = 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))

emir aksoydan 18.03.2022 01:11

Когда я экспортирую данные в quicktype, он дает мне приведенную выше модель.

emir aksoydan 18.03.2022 01:15

Нет, не дает custommodel

workingdog support Ukraine 18.03.2022 01:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

попробуйте следующие структуры:

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"

emir aksoydan 18.03.2022 01:04

моя ошибка отлова = 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))

emir aksoydan 18.03.2022 01:12

Замените JSONNull? на String? в Response и User. Обновил мой ответ.

workingdog support Ukraine 18.03.2022 01:18

Можете ли вы объяснить это? как это сработало

emir aksoydan 18.03.2022 01:26

Все, что я сделал, это использовал quicktype, здесь нет ничего волшебного. Вы не должны менять имена ключей, потому что это то, что заставляет все работать с данными json. Код (структуры) будет работать с JSONNull?, но кажется, что его проще использовать String? Если это ответ на ваш вопрос, не могли бы вы отметить его как правильный, с галочкой, спасибо.

workingdog support Ukraine 18.03.2022 02:33

Другие вопросы по теме