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 :

Désérailizer un json avec une propriété de type différent selon les appels


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 Désérailizer un json avec une propriété de type différent selon les appels
    Bonjour,

    Je développe un outil de monitoring en faisant des appels à une API du serveur.
    Je viens de me rendre compte que dans certains appel j'ai une propriété du même nom qui peut avoir un type différent (soit string soit int...)

    Comment je peux faire (sans recréer une nouvelle classe) pour indiquer que le type est soit un string soit un integer ?

    J'espère que je suis clair, vous pouvez mes poser des questions si vous ne comprenez pas ma demande

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 640
    Points : 2 149
    Points
    2 149
    Par défaut
    Bonjour,

    Je ne sais pas si il existe un moyen déjà existant mais personnellement je laisserai cette propriété en string et convertirait à la volée en int ou autre dès que j'en ai besoin et que je suis sûr qu'il s'agit d'un nombre.

    De cette manière, aucune perte d'information et Json.NET (ce que j'imagine tu utilises) permet de lire directement des nombres en string, il fait la conversion automatiquement.

  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
    J'utilise System.Text.Json (en .NET Core 3.1).
    Dans mon code, convertir un string en int et inversement, il y a aucun problème.

    Le problème c'est le retour d'un appel API, j'ai l'erreur comme quoi, il ne peut pas convertir un int en string.
    le problème vient de la méthode JsonSerializer.Deserialize<MaClass>(jsonString)

    Une même propriété est récupérée soit en string soit en int selon l'appel.
    Dans ma classe la propriété est en string, mais quand le json contient la propriété en int, j'ai une erreur.

  4. #4
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Bonjour,

    Et en modifiant votre classe et en déclarant la propriété en object ?

  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
    Bonjour,

    je n'ai pas essayé, mais j'ai trouvé un autre moyen de résoudre le problème et surtout de laissé la propriété en string.

    J'ai créer un JsonConverter personnalisé :
    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
    class intOrStringToStringJsonConverter : JsonConverter<string>
        {
            public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
            {
                if (reader.TokenType == JsonTokenType.Number)
                    return reader.GetInt32().ToString();
     
                return reader.GetString();
            }
     
            public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
            {
                writer.WriteStringValue(value);
            }
        }
    Je passe en résolu, si vous avez des questions je reste disponible

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/01/2017, 14h40
  2. Réponses: 7
    Dernier message: 15/09/2009, 15h54
  3. Réponses: 3
    Dernier message: 22/10/2006, 23h15
  4. [MySQL] Tester une égalité avec une donnée de type PASSWORD
    Par tiyolx dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/03/2006, 16h06
  5. Réponses: 2
    Dernier message: 18/10/2003, 14h42

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