IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

JsonSerializer désérialize json en classe


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2014
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 322
    Points : 124
    Points
    124
    Par défaut JsonSerializer désérialize json en classe
    Bonjour,

    Je fais appel à une API Rest et je récupère du json en .Net Core 3.1.

    Je voudrais récupérer le résultat dans une classe mais ça ne fonctionne pas correctement.

    Voici un bout du JSON :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    {
        "response":
        {
            "error_message":"",
            "nb_items":250,
            "out_societ":
            {
                "OutListeSociet":
                [
                    {
                        "codeSociet":88593,
                        "nomSociet":"GED1",
                        "prenomSociet":""
                    },
                    {
                        "codeSociet":93127,
                        "nomSociet":"GED2",
                        "prenomSociet":""
                    },
    Et voici mes classes créées en conséquences :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class ListeSociet
        {
            public string error_message;
            public int nb_items;
            public outSociet out_societ;
        }
     
        class outSociet
        {
            public List<outListeSociet> OutListeSociet;
        }
     
        class outListeSociet
        {
            public int codeSociet;
            public string nomSociet;
            public string prenomSociet;
        }
    En débug je vois que "out_societ" de ma classe ListeSociet est à null.

    Je ne sais pas comment résoudre ce problème. Je n'ai aucune erreur.

    Voici le code appelant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var resultat = JsonSerializer.Deserialize<ListeSociet>(result.Content.ReadAsStringAsync().Result);

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Hello,

    tu peux utiliser les attributs pour spécifier le nom de la propriété dans le Json
    https://docs.microsoft.com/fr-fr/dot...xt-json-how-to

    Peut être que comme ça il arrivera à faire le lien

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2014
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 322
    Points : 124
    Points
    124
    Par défaut
    Malheureusement non, ça ne change rien.

    Je récupère bien le "error_message" ainsi que le "nb_items".

    Mais le "out_societ" reste égal à null....

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Fait voir ton nouveau code ?

    En passant par un outil comme quicktype il me généère ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    namespace QuickType
    {
        using System;
        using System.Collections.Generic;
     
        using System.Globalization;
        using Newtonsoft.Json;
        using Newtonsoft.Json.Converters;
     
        public partial class Response
        {
            [JsonProperty("error_message")]
            public string ErrorMessage { get; set; }
     
            [JsonProperty("nb_items")]
            public long NbItems { get; set; }
     
            [JsonProperty("out_societ")]
            public OutSociet OutSociet { get; set; }
        }
     
        public partial class OutSociet
        {
            [JsonProperty("OutListeSociet")]
            public OutListeSociet[] OutListeSociet { get; set; }
        }
     
        public partial class OutListeSociet
        {
            [JsonProperty("codeSociet")]
            public long CodeSociet { get; set; }
     
            [JsonProperty("nomSociet")]
            public string NomSociet { get; set; }
     
            [JsonProperty("prenomSociet")]
            public string PrenomSociet { get; set; }
        }
    }
    Je ne sais pas si c'est newtonsoft ou text.json qui est utilisé sur net core 3.1

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2014
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 322
    Points : 124
    Points
    124
    Par défaut
    Je n'ai pas le code ici, je le mettrais demain une fois de retour au travail.

    J'utilise text.json avec .Net Core 3.1

    J'essayerai ta solution, si ça ne fonctionne toujours pas, j'essayerai avec Newtonsoft pour voir si ça passe.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2014
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 322
    Points : 124
    Points
    124
    Par défaut
    Bonjour,

    Bon... j'ai du rêver hier, mais au final, je ne récupère rien du tout dans ma classe....

    Voici le nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class Response
        {
            [JsonPropertyName("error_message")]
            public string error_message {get; set;}
            [JsonPropertyName("nb_items")]
            public int nb_items { get; set; }
            [JsonPropertyName("out_societ")]
            public outSociet out_societ { get; set; }
        }
     
        class outSociet
        {
            [JsonPropertyName("out_societ")]
            public List<outListeSociet> OutListeSociet { get; set; }
        }
     
        class outListeSociet
        {
            [JsonPropertyName("out_societ")]
            public int codeSociet { get; set; }
            [JsonPropertyName("out_societ")]
            public string nomSociet { get; set; }
            [JsonPropertyName("out_societ")]
            public string prenomSociet {get; set;}
        }
    Le problème semble différent de ce que je pensais.

    EDIT :

    J'ai l'impression que la méthode Deseralize de Text.Json ne fonctionne pas correctement, car quand j'essaye de deserialiser dans une classe complétement différentes, je n'ai aucune exception contrairement à ce qu'indique la doc...

    Voici le code testé sans exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Societ
        {
            public void getAll()
            {
                using (HttpClient client = new HttpClient())
                {
                    HttpResponseMessage result = client.GetAsync("************").Result;
                    string test = result.Content.ReadAsStringAsync().Result;
                    var resultat = JsonSerializer.Deserialize<Titi>(result.Content.ReadAsStringAsync().Result);
                }
            }
        }
     
        class Titi
        {
            public int rien;
        }
    EDIT 2 :

    Même avec Newtonsoft, la désérialisation ne fonctionne pas et sans exception...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HttpResponseMessage result = client.GetAsync("**********").Result;
                    string test = result.Content.ReadAsStringAsync().Result;
                    //var resultat = JsonSerializer.Deserialize<response>(result.Content.ReadAsStringAsync().Result);
     
                    response resultat = JsonConvert.DeserializeObject<response>(test);
    Il y a quelque chose que je ne doit pas comprendre....

  7. #7
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Et en passant les classes en public ?
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Quand tu log ton string test tu as quoi dedans, il est possible que tu es l'objet response au dessus. T'obligeant à déclarer la classe response en plus.

    Une raison pour laquelle ta méthode n'est pas asynchrone ?

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2014
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 322
    Points : 124
    Points
    124
    Par défaut
    Même en public, ça ne change rien.

    J'ai renommé la classe ListeSociet en response, aucun changement.

    Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class response
        {
            [JsonProperty("error_message")]
            public string error_message {get; set;}
            [JsonProperty("nb_items")]
            public int nb_items { get; set; }
            [JsonProperty("out_societ")]
            public outSociet out_societ { get; set; }
        }
     
        public class outSociet
        {
            [JsonProperty("out_societ")]
            public List<outListeSociet> OutListeSociet { get; set; }
        }
     
        public class outListeSociet
        {
            [JsonProperty("out_societ")]
            public int codeSociet { get; set; }
            [JsonProperty("out_societ")]
            public string nomSociet { get; set; }
            [JsonProperty("out_societ")]
            public string prenomSociet {get; set;}
        }
    C'est en synchrone pour ne pas m’embêter avec l’asynchrone, c'est juste une appli de test pour mon API, le programme n'a aucune vocation a être en production.

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2014
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 322
    Points : 124
    Points
    124
    Par défaut
    Je viens d'essayer en mettant mon json en dur dans mon code.

    J'avais des erreurs dans le JSON et je recevais bien des exceptions en m'indiquant par exemple :
    Newtonsoft.Json.JsonReaderException*: 'After parsing a value an unexpected character was encountered: M. Path 'response.out_societ.OutListeSociet[2].nomSociet', line 1, position 245.'
    Donc je suppose qu'il arrive a les créer....

    Une fois les erreurs dans le JSON corrigés, plus d'exceptions, mais rien ma classe reste bien vide....

    Mon JSON est trop gros ?

    EDIT : Même avec seulement 1 élément dans outListeSociet, je ne récupère pas les infos....

    Je ne comprends pas, je dois louper quelque chose....

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2014
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 322
    Points : 124
    Points
    124
    Par défaut
    Je viens de résoudre mon problème.
    Merci à vous 2 pour votre aide.

    Fonctionne avec Newtonsoft(mettre un tableau à la place d'une liste) et Text.Json

    Voici les classes nécessaires pour mon cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class ListeSociet
        {
            [JsonPropertyName("response")]
            public response response { get; set; }
        }
     
        public class response
        {
            [JsonPropertyName("error_message")]
            public string error_message {get; set;}
            [JsonPropertyName("nb_items")]
            public int nb_items { get; set; }
            [JsonPropertyName("out_societ")]
            public outSociet out_societ { get; set; }
        }
     
        public class outSociet
        {
            [JsonPropertyName("OutListeSociet")]
            public List<outListeSociet>  OutListeSociet { get; set; }
        }
     
        public class outListeSociet
        {
            [JsonPropertyName("codeSociet")]
            public int codeSociet { get; set; }
            [JsonPropertyName("nomSociet")]
            public string nomSociet { get; set; }
            [JsonPropertyName("prenomSociet")]
            public string prenomSociet {get; set;}
        }
    Il me manquait un objet englobant "response"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JSON] Générer clés valeurs de JSON vers Classe
    Par sinzen dans le forum Langages serveur
    Réponses: 10
    Dernier message: 08/12/2017, 11h00
  2. [Débutant] Accès champ JSON pour attribut classe Model
    Par zerguib dans le forum ASP.NET
    Réponses: 10
    Dernier message: 12/06/2013, 16h09
  3. JSON types et classes
    Par sekaijin dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 27/11/2010, 11h43
  4. generation de xml et json a partir de "class".
    Par wiztricks dans le forum Général Python
    Réponses: 0
    Dernier message: 22/06/2010, 20h46
  5. Classe personnalisée pour JSON
    Par Devil Shark dans le forum ActionScript 3
    Réponses: 5
    Dernier message: 14/01/2010, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo