Erreur de Structure?

Bonjour j’ai un problème pour créer ma structure !

Ma structure:


struct ListData: Decodable  {
    let statusCode: Int
    let success: Bool
    let data: [DataTask]?
}

struct DataTask: Decodable {
    
    let rows_returned: Int?
    let tasks: [Tasks]
}

struct Tasks: Decodable, Identifiable {
    var id: Int?
    var title: String?
    var description: String?
    var deadline: String?
    var completed: String?
    var images: String?
    
}

Par rapport a cette réponse de Json


["statusCode": 200, "success": 1, "messages": <__NSArray0 0x1dc808000>(
 
 )
 , "data": {
 "rows_returned" = 5;
 tasks =     (
 {
 completed = Y;
 deadline = "25/01/2022 10:00";
 description = "Mise en place de l\U2019API test";
 id = 1;
 images =             (
 );
 title = APIREST;
 },
 {
 completed = Y;
 deadline = "27/01/2022 10:00";
 description = "Mise en place du Front en Php pour test API";
 id = 2;
 images =             (
 );
 title = "Front Interface";
 }
 );
 }]

Et le tableau messages qui retourn qu’une string je sais pas comment le faire également.

La un peux d’aide serais le bien venue.

Je te donnerais bien un coup de main, mais j’ai toujours des difficultés pour percuter. Je ne vois pas bien quel est ton problème. Je ne comprends pas pourquoi toutes les propriétés de ta struct Tasks sont absolument toutes optionnelles. As-tu le droit de déclarer ta struct conforme au protocole Identifiable avec une id optionnelle (je ne me suis jamais penché sur la question auparavant, mais j’en serais surpris ; peut-être ai-je tort ?). Tes trois struct sont déclarées Decodable, ne sont-elles pas surtout Encodable en json ?

Pour bien comprendre le problème, l’idée, c’est que ce sont des éléments pour remplir une grille ? Une sorte de tableau avec des tâches qui doivent être effectuées avant une date précise ? Le json c’est ce que te renvoie un webservice, une base de données ou un truc comme ça ?
StatusCode voudrait dire que ta requête s’est bien déroulée (200) et concernerait seulement la requête auprès du web service. Les message seraient en fait non codés vraiment en json comme il faut, ils viennent d’où au départ ?

Excuse-moi de te demander tout ça, c’est pour comprendre.

Merci pour ta réponse. Je les et mis en optionnel pour les remettre une a une pour voir les quel marche ou pas ? J’ai deux options en json une marche l’autre pas. Bon normale une decode sans structurer et je vois mes données, l’autre avec la structure qui me mets une erreur de la structure. Je peux fournir le code pas de soucis c’est sur un Webservice de test que j’ai mis en place.

J’attends avec impatience un cours avec directus comme web service, avec pour example la gestion d’’Event ( Titre , date , lieux) par example avec liste de participant ( nom , email, tel) et la gestion des user et des Évents . Avec une application comme ca je pense que après je pourrais tout faire. Car on verras la gestions des dates , la communication complete avec un Webservice CRUD .

J’ai déjà réaliser une appli brouillon avant de faire les cours qui marche pas trop mal. Mais en vu des cours suivis il y a du taff a la reprendre entièrement , ca seras un bon TP pour moi.

Je vais monter d’ailleurs mon vieux MacBook Pro intel en serveur directus sur Linux.

Voilà le retour que j’ai avec une appli pour test le retour du Webservice.


{
  "success" : true,
  "statusCode" : 200,
  "messages" : [

  ],
  "data" : {
    "rows_returned" : 5,
    "tasks" : [
      {
        "id" : 1,
        "title" : "APIREST",
        "deadline" : "25\/01\/2022 10:00",
        "description" : "Mise en place de l’API test",
        "completed" : "Y",
        "images" : [

        ]
      },
      {
        "id" : 2,
        "title" : "Front Interface",
        "deadline" : "27\/01\/2022 10:00",
        "description" : "Mise en place du Front en Php pour test API",
        "completed" : "Y",
        "images" : [

        ]
      },
      {
        "id" : 3,
        "title" : "Front Interface",
        "deadline" : "15\/02\/2022 10:00",
        "description" : "Coder -> ajouter - modifier - effacer",
        "completed" : "N",
        "images" : [

        ]
      },
      {
        "id" : 4,
        "title" : "Appli IOS 15",
        "deadline" : "15\/12\/2022 10:00",
        "description" : "Finaliser Appli IOS",
        "completed" : "N",
        "images" : [

        ]
      },
      {
        "id" : 5,
        "title" : "test 5",
        "deadline" : "13\/02\/2022 15:30",
        "description" : "test de creation de tache 5",
        "completed" : "N",
        "images" : [

        ]
      }
    ]
  }

Mais je n’arrive pas a créer la bonne struct

Salut @EricS,

En fait, tu devrais mieux nous dire ce que tu veux faire, car là, il n’y a aucune erreur.

Le web service te retournes un code 200 qui veut dire que tout c’est bien passé.

Donc, dis-nous ce que tu veux envoyer et ce que tu attends en retour.

je n’arrive pas a créer la bonne structure pour me servir des données dans une liste.

func LoadTasks() {
        
        if UserDefaults.standard.bool(forKey: "myKey") {
            accessToken = UserDefaults.standard.string(forKey: "accessToken")!
            refreshToken = UserDefaults.standard.string(forKey: "refreshToken")!
            sessionID = UserDefaults.standard.string(forKey: "sessionID")!
            //username = UserDefaults.standard.string(forKey: "username")!
        } // if
        tasksArray = []
        let urlTask = "https://ericapi.alwaysdata.net/api5/tasks"
        var request = URLRequest(url: URL(string:urlTask)!)
        request.httpMethod = "GET"
        request.addValue("application/json;charset=utf-8", forHTTPHeaderField: "Content-Type")
        request.addValue("\(accessToken)", forHTTPHeaderField: "Authorization")
        //request.addValue("token56", forHTTPHeaderField: "Authorization")
        
        let task = URLSession.shared.dataTask(with: request, completionHandler: { data, response, error -> Void in
            guard error == nil else {
                print("Error with connection")
                return
            }
            
            let status = (response as! HTTPURLResponse).statusCode
            //print(response as Any)
            //print(data as Any)
            if status == 200 {
                do {
                    let json = try JSONDecoder().decode([Response].self, from: data!) 
                    //self.tasksArray = json.data
                    
                    //let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, AnyObject>
                    
                    //print(tasksArray)
                    //let tasks = json["data"]
                    //let NumberRows = tasks?["rows_returned"] ?? 0 
                    //self.NumRows = NumberRows as! Int
                    
                    
                    
                    /*
                     for task in tasks {
                     let tempTask = Task(
                     id: = task?["id"] ?? 0,
                     title: task["title"] as! String,
                     description: task["description"] as! String,
                     deadline: task["deadline"] as! String,
                     completed: task["completed"] as! String
                     )
                     
                     self.tasksArray.append(tempTask)
                     
                     }
                     */
                    
                    
                    
                    print(data as Any)
                    print(json)
                } //do
                catch {
                    //print(status)
                    print(error)
                    //print(tasksArray)
                    //tasksArray = [Task(id: 1, title: "Task :", description: "Decode by Json fail / Statut : \(status)\n Data -> \(data as Any)", completed: "N")]
                } // catch
            } // statut  
            else {
                print("Erreur Token \(status)") 
                //ÙtasksArray = [Task(id: 1, title: "Task :", description: "Erreur Token, Statut : \(status)", completed: "N")]
            }
        })
        task.resume()
        
    } // func

Ça donne une idée bon le code et a refaire entièrement , je l’ai fait avant de faire aucun cours . Mon travaille quand j’aurais réussi pour les donnees seras de le reprendre tout mon code et de le créer avec les class contrôleur et View contrôleur . je parviens dans ma requête du login a récupérer mes tokens tout vas bien et la pour trouver la structure je parvient pas ? avec le →
let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, AnyObject>. je récupère toute les donnée mais impossible de les mettre en forme et les ajouter au tableau. Mais idéalement c’est la solution que j’ai laisser active que j’aimerais faire marcher. J’ai désactiver Authentification si jamais quelqu’un veux tester pour trouver la structure

PS: Soyez indulgent je suis grand débutant . Je vais tout recoder après tranquillement avec se que j’ai appris grâce au cours de Purple girafe

Problème résolu merci