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 :

Deserialization Json apres requete API Rest


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Deserialization Json apres requete API Rest
    Bonjour

    J'essaye sans success de deserializer le résultat d'une requête sur une API rest

    Ma compréhension a certainement dérapé qq part et je n'ai pas encore trouvé la bonne explication


    Voici ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       client.BaseAddress = new Uri(UR);
     
          // Add an Accept header for JSON format.
          client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
     
          // List data response.
          HttpResponseMessage response = client.GetAsync(urlParameters).Result;  
     
          if (response.IsSuccessStatusCode)
          {
            var json = response.Content.ReadAsStringAsync().Result;
            JsonConvert.DeserializeObject<C_Record16>(json);  // Ne fonctionne pas ???
          }
    La desérialisation me donne l'erreur suivante :
    Citation Envoyé par JsonConvert.DeserializeObject<C_Record16>(json)
    An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll

    Additional information: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'TestGPS4NetRest.C_Record16' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.

    To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.

    Path '', line 1, position 1.
    Pourtant ma chaine Json resultat me semble correcte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{\"ALT\":\"17.70\",\"COG\":\"320.90\",\"DLOG\":\"1.00\",\"ENGINESTAT\":\"0\",\"ERROR\":0,\"FAVNETSTAT\":\"0\",\"GPRSSTAT\":\"1\",\"GSMLVL\":\"73.33\",\"GSMREGSTAT\":\"1\",\"GUS\":\"9\",\"IBAUTHSTAT\":\"0\",\"LAT\":\"50.901020\",\"LON\":\"3.407278\",\"NAVST\":\"1\",\"NST\":1,\"PANICBUTTONSTAT\":\"0\",\"PDOP\":\"2.4\",\"PRIVATESTAT\":\"0\",\"RELAYSTAT\":\"0\",\"ROAMINGSTAT\":\"1\",\"SBN\":\"08\",\"SEQ\":null,\"SOG\":\"0.00\",\"SWV\":\"22\",\"TIMESTAMP\":\"2016-11-13 07:00:09\",\"TRIGGER_SOURCE\":null,\"WARN\":0,\"gps_id\":\"2270\",\"id\":\"485\",\"msg_source\":\"2\"}]
    Et j'ai aussi très patiemment construit ma classe destination en vérifiant plusieurs fois (ci dessous)

    Quelle est mon erreur ?
    Merci de votre aide

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
      public class C_Record16
      {
     
        [JsonProperty("ALT")]
        public string ALT { get; set; }
     
        [JsonProperty("COG")]
        public string COG { get; set; }
     
        [JsonProperty("NAVST")]
        public string NAVST { get; set; }
     
        [JsonProperty("INPUTPWR_FAILURE")]
        public string INPUTPWR_FAILURE { get; set; }
     
        [JsonProperty("ENGINESTAT")]
        public string ENGINESTAT { get; set; }
     
        [JsonProperty("DLOG")]
        public string DLOG { get; set; }
     
        [JsonProperty("TRIGGER_SOURCE")]
        public string TRIGGER_SOURCE { get; set; }
     
        [JsonProperty("SWV")]
        public string SWV { get; set; }
     
        [JsonProperty("LAT")]
        public string LAT { get; set; }
     
        [JsonProperty("ROAMINGSTAT")]
        public string ROAMINGSTAT { get; set; }
     
        [JsonProperty("SEQ")]
        public string SEQ { get; set; }
     
        [JsonProperty("msg_source")]
        public string msg_source { get; set; }
     
        [JsonProperty("RELAYSTAT")]
        public string RELAYSTAT { get; set; }
     
        [JsonProperty("rectyp")]
        public string rectyp { get; set; }
     
        [JsonProperty("gps_id")]
        public string gps_id { get; set; }
     
        [JsonProperty("GUS")]
        public string GUS { get; set; }
     
        [JsonProperty("ACCSTAT")]
        public string ACCSTAT { get; set; }
     
        [JsonProperty("FAVNETSTAT")]
        public string FAVNETSTAT { get; set; }
     
        [JsonProperty("ACCUVOLTAGE_UNDERTRESHOLD")]
        public string ACCUVOLTAGE_UNDERTRESHOLD { get; set; }
     
        [JsonProperty("NST")]
        public string NST { get; set; }
     
        [JsonProperty("INPUTPWR_OVERVOLTAGE")]
        public string INPUTPWR_OVERVOLTAGE { get; set; }
     
        [JsonProperty("SOG")]
        public string SOG { get; set; }
     
        [JsonProperty("id")]
        public string id { get; set; }
     
        [JsonProperty("ERROR")]
        public string ERROR { get; set; }
     
        [JsonProperty("TIMESTAMP")]
        public string TIMESTAMP { get; set; }
     
        [JsonProperty("LON")]
        public string LON { get; set; }
     
        [JsonProperty("PANICBUTTONSTAT")]
        public string PANICBUTTONSTAT { get; set; }
     
        [JsonProperty("GSMREGSTAT")]
        public string GSMREGSTAT { get; set; }
     
        [JsonProperty("GSMLVL")]
        public string GSMLVL { get; set; }
     
        [JsonProperty("WARN")]
        public string WARN { get; set; }
     
        [JsonProperty("GPRSSTAT")]
        public string GPRSSTAT { get; set; }
     
        [JsonProperty("SBN")]
        public string SBN { get; set; }
     
      }

  2. #2
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    J'ai l'impression que ta chaine JSON est sensée représenter un tableau d'objets et que tu essaie de la désérialiser sous la forme d'un objet seul. Est-ce-qu'il ne te faut pas quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var list = JsonConvert.DeserializeObject<List<C_Record16>>(json);

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Noxen

    Bonne remarque !
    C'est peut etre ça le bingz : moi je voyais un objet Mais en fait le Json exprime qu'il y a potentiellement un Array

    Je teste ça

  4. #4
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Bien vu Noxen
    C'etait effectivement le problème

    Bravo pour ta perspicacité !

    Par la même occasion et comme tu semble avoir plus d'expérience que moi sur ce sujet, je cherche a comprendre comment ajouter des paramètres dans cette commande rest

    La syntaxe documentée est celle ci

    http://myhost.com/mw/psn/ABCDEFG/rec...xxxxxxxxxxxxxx

    Que j'ai traduit de la manière ci après et ça marche très bien grâce a ton aide
    Mais la doc signale sans que je peux utiliser (entre autre) des paramètre from_date et to_date
    Du style
    from_date=2016-11-12 to_date=2016-11-13

    Mais étant complètement novice en cette matière je n'ai pas encore bien capté quelle était la bonne maniéré d'ajouter des paramètres

    Dois-je moi même formater la chaîne ?
    Sur base d'exemples j'ai employé la méthode ci après dans laquelle la key n'est déjà plus dans l'url de base mais passée en paramètre
    Mais quid des autres paramètres : psn, record

    J'avoue que c'est encore un peu ténébreux !

    Merci pour toute aide / recommandation

    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
     
    private const string BaseURL = @"http://gis.gps4net.info/mw/psn/{0}/record/{1}";
      private static string urlParameters = "?key=xxxxxxxxxxxxxxxxxxxx";
        static public void Run()
        {
          HttpClient client = new HttpClient();
     
          string UR = string.Format(BaseURL, "ABCDEFG", "16"); 
          client.BaseAddress = new Uri(UR);
     
          // Add an Accept header for JSON format.
          client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
     
          // List data response.
          HttpResponseMessage response = client.GetAsync(urlParameters).Result;  
     
          if (response.IsSuccessStatusCode)
          {
     
            var json = response.Content.ReadAsStringAsync().Result;
            var JJ=JsonConvert.DeserializeObject<List<C_Record16>>(json);
          }
          else
          {
            Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
          }
        }

  5. #5
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Bah je ne m'y connais pas plus que ça. De ce que je comprends avec la documentation sur BaseAddress et GetAsync(string) l'uri effectivement utilisée sera la combinaison de l'adresse de base éventuellement fournie avec BaseAddress et de l'uri de GetAsync(), tu pourras donc simplement préciser une uri relative pour GetAsync(). Je suppose que tu crées ton uri relative avec tes paramètres et que tu la passe à l'appel de méthode ; je ne suis pas sûr du format utilisé par contre, i.e. est-ce-qu'il faut échapper la chaîne ou est-ce-que ce sera fait en interne (voir : https://msdn.microsoft.com/fr-fr/lib...v=vs.110).aspx). Tu peux essayer quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var client = new HttpClient();
    client.BaseAddress = "http://monjournal.com";
    var dicoParam = new Dictionary<string, string> { { "article", "340" }, { "lang", "fr-FR" }, { "format", "full" } };
    var paramString = "?" + string.Join("&", dicoParam.Select(pair => pair.Key + "=" + pair.Value));
    // donne : "?article=340&lang=fr-FR&format=full"
    // Décommenter pour échapper la chaine
    // paramString = Uri.EscapeUriString(paramString);
    var article = client.GetAsync(paramString).Result;
    À tester, aucune idée de ce que ça vaut.

Discussions similaires

  1. [Lazarus] Envoyer des données JSON sur API REST par la méthode PUT
    Par Jon Shannow dans le forum Lazarus
    Réponses: 11
    Dernier message: 13/05/2016, 08h30
  2. Format d'un JSON pour une API REST
    Par pierapi dans le forum Langage
    Réponses: 2
    Dernier message: 17/09/2015, 15h15
  3. Réponses: 1
    Dernier message: 02/03/2015, 15h01
  4. Problèmes d'espaces après requete SQL
    Par innosang dans le forum Bases de données
    Réponses: 7
    Dernier message: 29/04/2004, 16h47
  5. Nombre de tuples apres requete
    Par afan dans le forum MFC
    Réponses: 4
    Dernier message: 19/03/2004, 12h02

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