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 :

Conversion du résulat d'une requête http style JSON de l'API IEX en object utilisable en C#


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 247
    Points : 106
    Points
    106
    Par défaut Conversion du résulat d'une requête http style JSON de l'API IEX en object utilisable en C#
    Bonjour,

    J'ai un petit programme d'alertes de cotes boursière qui fonctionne bien mais dernièrement j'ai ajouté beaucoup de symboles ce qui a augmenté considérablement le temps de réponse des requêtes car je fais une requête pour chaque symbole ! J'utilise l'IEX API pour extraire les données boursières. J'ai la possibilité d'utiliser une requête BATCH ce qui devrait accélérer le traitement.

    La requête fonctionne bien j'ai les bons résultats c'est la conversion le problème. J'ai besoin de convertir le résultats de la requête en un objet C# utilisable avec foreach{}

    Voici 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
    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
           // ON VEUT LES DONNÉES POUR AAPL, TSLA, BABA EN UNE SEULE REQUÊTE
                var IEXTrading_API_PATH = "https://api.iextrading.com/1.0/stock/market/batch?symbols=AAPL,TSLA,BABA&types=quote";
     
                using (HttpClient client = new HttpClient())
                {
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
     
                    client.BaseAddress = new Uri(IEXTrading_API_PATH);
     
                    HttpResponseMessage response = client.GetAsync(IEXTrading_API_PATH).GetAwaiter().GetResult();
     
                    if (response.IsSuccessStatusCode)
                    {
                        // Pour débogger j'ai ajouté ces 3 lignes
                        // Examiner le contenu de RESP dans le debuggeur toutes les données sont là donc pas de problème ici
                        var RESP = response.Content.ReadAsStringAsync().Result;
     
                        // Examiner le contenu de json. On obtient bien toutes les données pour AAPL, TSLA, BABA bien séparé pas de problème ici non plus
                        dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(RESP);
     
                        // On affiche le contenu juste pour débogger
                        richTextBox1.AppendText(Newtonsoft.Json.JsonConvert.DeserializeObject(RESP).ToString());
     
                        // Problème ici  comment convertir les données en une variable itérable pour foreach{} ? 
                        // Vous avec une classe StockQuote.cs que j'utilise ailleurs sans problème mais pas dans une requete batch comme ci-dessus. 
     
                        List<StockQuote> DataList = JsonConvert.DeserializeObject<List<StockQuote>>(json);  // Problème de conversion ***************************
     
                        // Je vous épargne tout le code essayé ... 
     
                        foreach (var Data in json) // J'ai mis json ici juste pour que ça compile car DataList plante juste en haut.
                        {
                            richTextBox1.AppendText(string.Format("symbol               : {0}\r\ncompanyName          : {1}\r\nprimaryExchange      : {2}\r\n", Data.symbol, Data.companyName, Data.primaryExchange));
                            richTextBox1.AppendText(string.Format("sector               : {0}\r\ncalculationPrice     : {1}\r\nopen                 : {2}\r\n", Data.sector, Data.calculationPrice, Data.open));
                            richTextBox1.AppendText(string.Format("openTime             : {0}\r\nclose                : {1}\r\ncloseTime            : {2}\r\n", Data.openTime, Data.close, Data.closeTime));
                            richTextBox1.AppendText(string.Format("high                 : {0}\r\nlow                  : {1}\r\nlatestPrice          : {2}\r\n", Data.high, Data.low, Data.latestPrice));
                            richTextBox1.AppendText(string.Format("latestSource         : {0}\r\nlatestTime           : {1}\r\nlatestUpdate         : {2}\r\n", Data.latestSource, Data.latestTime, Data.latestUpdate));
                            richTextBox1.AppendText(string.Format("latestVolume         : {0}\r\niexRealtimePrice     : {1}\r\niexRealtimeSize      : {2}\r\n", Data.latestVolume, Data.iexRealtimePrice, Data.iexRealtimeSize));
                            richTextBox1.AppendText(string.Format("iexLastUpdated       : {0}\r\ndelayedPrice         : {1}\r\ndelayedPriceTime     : {2}\r\n", Data.iexLastUpdated, Data.delayedPrice, Data.delayedPriceTime));
                            richTextBox1.AppendText(string.Format("extendedPrice        : {0}\r\nextendedChange       : {1}\r\nextendedChangePercent: {2}\r\n", Data.extendedPrice, Data.extendedChange, Data.extendedChangePercent));
                            richTextBox1.AppendText(string.Format("extendedPriceTime    : {0}\r\npreviousClose        : {1}\r\nchange               : {2}\r\n", Data.extendedPriceTime, Data.previousClose, Data.change));
                            richTextBox1.AppendText(string.Format("changePercent        : {0}\r\niexMarketPercent     : {1}\r\niexVolume            : {2}\r\n", Data.changePercent, Data.iexMarketPercent, Data.iexVolume));
                            richTextBox1.AppendText(string.Format("avgTotalVolume       : {0}\r\niexBidPrice          : {1}\r\niexBidSize           : {2}\r\n", Data.avgTotalVolume, Data.iexBidPrice, Data.iexBidSize));
                            richTextBox1.AppendText(string.Format("iexAskPrice          : {0}\r\niexAskSize           : {1}\r\nmarkeyCap            : {2}\r\n", Data.iexAskPrice, Data.iexAskSize, Data.marketCap));
                            richTextBox1.AppendText(string.Format("peRatio              : {0}\r\nweek52High           : {1}\r\nweek52Low            : {2}\r\n", Data.peRatio, Data.week52High, Data.week52Low));
                            richTextBox1.AppendText(string.Format("ytdChange            : {0}\r\n", Data.ytdChange));
                        }
                    }
                }
    J'utilise une classe StockQuote.cs pour désérialiser

    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace IEX_Stock_Data
    {
        class StockQuote
        {
            public string           symbol { get; set; }
            public string           companyName { get; set; }
            public string           primaryExchange { get; set; }
            public string           sector { get; set; }
            public string           calculationPrice { get; set; }
            public Nullable<double> open { get; set; }
            public Nullable<UInt64> openTime { get; set; }
            public Nullable<double> close { get; set; }
            public Nullable<UInt64> closeTime { get; set; }
            public Nullable<double> high { get; set; }
            public Nullable<double> low { get; set; }
            public Nullable<double> latestPrice { get; set; }
            public string           latestSource { get; set; }
            public string           latestTime { get; set; }
            public Nullable<UInt64> latestUpdate { get; set; }
            public Nullable<UInt64> latestVolume { get; set; }
            public Nullable<double> iexRealtimePrice { get; set; }
            public Nullable<UInt64> iexRealtimeSize { get; set; }
            public Nullable<UInt64> iexLastUpdated { get; set; }
            public Nullable<double> delayedPrice { get; set; }
            public Nullable<UInt64> delayedPriceTime { get; set; }
            public Nullable<double> extendedPrice { get; set; }
            public Nullable<double> extendedChange { get; set; }
            public Nullable<double> extendedChangePercent { get; set; }
            public Nullable<UInt64> extendedPriceTime { get; set; }
            public Nullable<double> previousClose { get; set; }
            public Nullable<double> change { get; set; }
            public Nullable<double> changePercent { get; set; }
            public Nullable<double> iexMarketPercent { get; set; }
            public Nullable<UInt64> iexVolume { get; set; }
            public Nullable<UInt64> avgTotalVolume { get; set; }
            public Nullable<double> iexBidPrice { get; set; }
            public Nullable<UInt64> iexBidSize { get; set; }
            public Nullable<double> iexAskPrice { get; set; }
            public Nullable<UInt64> iexAskSize { get; set; }
            public Nullable<UInt64> marketCap { get; set; }
            public Nullable<double> peRatio { get; set; }
            public Nullable<double> week52High { get; set; }
            public Nullable<double> week52Low { get; set; }
            public Nullable<double> ytdChange { get; set; }
        }
    }
     
    public class RootObject<T>
    {
        public List<T> StockQuote { get; set; }
     
    }
    Le résultat de la requete est bon voir ci-dessous. J'ai exécuté dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(RESP); pour examiner le résultat de la requête avec 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
    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    {{
      "AAPL": {
        "quote": {
          "symbol": "AAPL",
          "companyName": "Apple Inc.",
          "primaryExchange": "Nasdaq Global Select",
          "sector": "Technology",
          "calculationPrice": "close",
          "open": 195.28,
          "openTime": 1553261400603,
          "close": 191.05,
          "closeTime": 1553284800222,
          "high": 197.69,
          "low": 190.78,
          "latestPrice": 191.05,
          "latestSource": "Close",
          "latestTime": "March 22, 2019",
          "latestUpdate": 1553284800222,
          "latestVolume": 42247649,
          "iexRealtimePrice": null,
          "iexRealtimeSize": null,
          "iexLastUpdated": null,
          "delayedPrice": 191.06,
          "delayedPriceTime": 1553284800252,
          "extendedPrice": 191.15,
          "extendedChange": 0.1,
          "extendedChangePercent": 0.00052,
          "extendedPriceTime": 1553288394795,
          "previousClose": 195.09,
          "change": -4.04,
          "changePercent": -0.02071,
          "iexMarketPercent": null,
          "iexVolume": null,
          "avgTotalVolume": 26514563,
          "iexBidPrice": null,
          "iexBidSize": null,
          "iexAskPrice": null,
          "iexAskSize": null,
          "marketCap": 900854244000,
          "peRatio": 16.1,
          "week52High": 233.47,
          "week52Low": 142,
          "ytdChange": 0.19426912499880772
        }
      },
      "TSLA": {
        "quote": {
          "symbol": "TSLA",
          "companyName": "Tesla Inc.",
          "primaryExchange": "Nasdaq Global Select",
          "sector": "Consumer Cyclical",
          "calculationPrice": "close",
          "open": 272.58,
          "openTime": 1553261400322,
          "close": 264.53,
          "closeTime": 1553284800409,
          "high": 272.8,
          "low": 264,
          "latestPrice": 264.53,
          "latestSource": "Close",
          "latestTime": "March 22, 2019",
          "latestUpdate": 1553284800409,
          "latestVolume": 8710447,
          "iexRealtimePrice": null,
          "iexRealtimeSize": null,
          "iexLastUpdated": null,
          "delayedPrice": 264.53,
          "delayedPriceTime": 1553284800409,
          "extendedPrice": 264.82,
          "extendedChange": 0.29,
          "extendedChangePercent": 0.0011,
          "extendedPriceTime": 1553288389813,
          "previousClose": 274.02,
          "change": -9.49,
          "changePercent": -0.03463,
          "iexMarketPercent": null,
          "iexVolume": null,
          "avgTotalVolume": 9009866,
          "iexBidPrice": null,
          "iexBidSize": null,
          "iexAskPrice": null,
          "iexAskSize": null,
          "marketCap": 45690014956,
          "peRatio": -44.99,
          "week52High": 387.46,
          "week52Low": 244.5901,
          "ytdChange": -0.18163760995743591
        }
      },
      "BABA": {
        "quote": {
          "symbol": "BABA",
          "companyName": "Alibaba Group Holding Limited",
          "primaryExchange": "New York Stock Exchange",
          "sector": "Consumer Cyclical",
          "calculationPrice": "close",
          "open": 179.78,
          "openTime": 1553261417588,
          "close": 176.26,
          "closeTime": 1553284838167,
          "high": 180.48,
          "low": 175.336,
          "latestPrice": 176.26,
          "latestSource": "Close",
          "latestTime": "March 22, 2019",
          "latestUpdate": 1553284838167,
          "latestVolume": 11667298,
          "iexRealtimePrice": null,
          "iexRealtimeSize": null,
          "iexLastUpdated": null,
          "delayedPrice": 176.26,
          "delayedPriceTime": 1553284838167,
          "extendedPrice": 176,
          "extendedChange": -0.26,
          "extendedChangePercent": -0.00148,
          "extendedPriceTime": 1553288392760,
          "previousClose": 181.5,
          "change": -5.24,
          "changePercent": -0.02887,
          "iexMarketPercent": null,
          "iexVolume": null,
          "avgTotalVolume": 11938888,
          "iexBidPrice": null,
          "iexBidSize": null,
          "iexAskPrice": null,
          "iexAskSize": null,
          "marketCap": 456898397315,
          "peRatio": 45.9,
          "week52High": 211.7,
          "week52Low": 129.77,
          "ytdChange": 0.26052283101682522
        }
      }
    }}
    Maintenant il faut convertir ce résultat en un objet utilisable en C#.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    il te faut écrire une classe qui corresponde à la structure du json attendu, et l'utiliser à la place de dynamic
    et dans visual studio il y a un menu permettant de générer le code d'une classe à partir de json ou xml
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 247
    Points : 106
    Points
    106
    Par défaut
    Bon, j'ai découvert que Visual Studio possède déjà la fonctionnalité de créer une classe à partir du format JSON allez voir ici https://www.matthewproctor.com/json-...paste-special/

    J'ai généré la classe Rootobject je vous donne le contenu complet de la classe

    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
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace IEX_Stock_Data
    {
        public class Rootobject
        {
            public string symbol { get; set; }
            public string companyName { get; set; }
            public string primaryExchange { get; set; }
            public string sector { get; set; }
            public string calculationPrice { get; set; }
            public float open { get; set; }
            public long openTime { get; set; }
            public float close { get; set; }
            public long closeTime { get; set; }
            public float high { get; set; }
            public float low { get; set; }
            public float latestPrice { get; set; }
            public string latestSource { get; set; }
            public string latestTime { get; set; }
            public long latestUpdate { get; set; }
            public int latestVolume { get; set; }
            public int iexRealtimePrice { get; set; }
            public int iexRealtimeSize { get; set; }
            public int iexLastUpdated { get; set; }
            public float delayedPrice { get; set; }
            public long delayedPriceTime { get; set; }
            public float extendedPrice { get; set; }
            public float extendedChange { get; set; }
            public float extendedChangePercent { get; set; }
            public long extendedPriceTime { get; set; }
            public float previousClose { get; set; }
            public float change { get; set; }
            public float changePercent { get; set; }
            public int iexMarketPercent { get; set; }
            public int iexVolume { get; set; }
            public int avgTotalVolume { get; set; }
            public int iexBidPrice { get; set; }
            public int iexBidSize { get; set; }
            public int iexAskPrice { get; set; }
            public int iexAskSize { get; set; }
            public long marketCap { get; set; }
            public float peRatio { get; set; }
            public float week52High { get; set; }
            public int week52Low { get; set; }
            public float ytdChange { get; set; }
        }
    }
    maintenant j'ai l'exception:

    Newtonsoft.Json.JsonSerializationException
    HResult=0x80131500
    Message=Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[IEX_Stock_Data.Rootobject]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
    To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.

    avec le code exécuté

    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
    var IEXTrading_API_PATH = "https://api.iextrading.com/1.0/stock/market/batch?symbols=AAPL,TSLA,BABA&types=quote";
     
    using (HttpClient client = new HttpClient())
    {
      client.DefaultRequestHeaders.Accept.Clear();
      client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
     
      //For IP-API
      client.BaseAddress = new Uri(IEXTrading_API_PATH);
     
      HttpResponseMessage response = client.GetAsync(IEXTrading_API_PATH).GetAwaiter().GetResult();
     
      var RESP = response.Content.ReadAsStringAsync().Result;
     
      if (response.IsSuccessStatusCode)
      {
        List<Rootobject> DataList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Rootobject>>(RESP);  <<*********** Problème ici
     
        foreach (var Data in DataList)
        {
        ...
        }
      }
    ...
    }
    J'ai examiné le contenu de RESP dans le débogueur et les données sont bonnes ce n'est qu'un problème de conversion

    Suggestions bienvenue !

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 895
    Points : 1 911
    Points
    1 911
    Par défaut
    Il y a quoi comme chaîne dans REST ? Tel que je le sens tu as la description d'un objet {"prop1":"value1", "prop2":"value2"} et pas d'un tableau [{"prop":"value1"},{"prop":"value2"}], tandis que tu essaies de le désérialiser en List<Rootobject>. Ce ne serait pas justement la description de ton Rootobject et non d'une liste de Rootobject ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 247
    Points : 106
    Points
    106
    Par défaut
    Ok. Après avoir fait > var RESP = response.Content.ReadAsStringAsync().Result;

    J'obtiens RESP =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "{\"AAPL\":{\"quote\":{\"symbol\":\"AAPL\",\"companyName\":\"Apple Inc.\",\"primaryExchange\":\"Nasdaq Global Select\",\"sector\":\"Technology\",\"calculationPrice\":\"previousclose\",\"open\":191.54,\"openTime\":1553520601056,\"close\":188.74,\"closeTime\":1553544000372,\"high\":191.98,\"low\":186.6,\"latestPrice\":188.74,\"latestSource\":\"Previous close\",\"latestTime\":\"March 25, 2019\",\"latestUpdate\":1553472000000,\"latestVolume\":573874,\"iexRealtimePrice\":0,\"iexRealtimeSize\":0,\"iexLastUpdated\":0,\"delayedPrice\":188.74,\"delayedPriceTime\":1553544000372,\"extendedPrice\":191.107,\"extendedChange\":2.367,\"extendedChangePercent\":0.01254,\"extendedPriceTime\":1553605243451,\"previousClose\":188.74,\"change\":0,\"changePercent\":0,\"iexMarketPercent\":0,\"iexVolume\":0,\"avgTotalVolume\":27162094,\"iexBidPrice\":0,\"iexBidSize\":0,\"iexAskPrice\":0,\"iexAskSize\":0,\"marketCap\":889961947200,\"peRatio\":15.9,\"week52High\":233.47,\"week52Low\":142,\"ytdChange\":0.20028872050392552}},\"TSLA\":{\"quote\":{\"symbol\":\"TSLA\",\"companyName\":\"Tesla Inc.\",\"primaryExchange\":\"Nasdaq Global Select\",\"sector\":\"Consumer Cyclical\",\"calculationPrice\":\"previousclose\",\"open\":260,\"openTime\":1553520600327,\"close\":260.42,\"closeTime\":1553544000391,\"high\":263.18,\"low\":254.46,\"latestPrice\":260.42,\"latestSource\":\"Previous close\",\"latestTime\":\"March 25, 2019\",\"latestUpdate\":1553472000000,\"latestVolume\":90208,\"iexRealtimePrice\":0,\"iexRealtimeSize\":0,\"iexLastUpdated\":0,\"delayedPrice\":260.42,\"delayedPriceTime\":1553544000391,\"extendedPrice\":263.6,\"extendedChange\":3.18,\"extendedChangePercent\":0.01221,\"extendedPriceTime\":1553605243308,\"previousClose\":260.42,\"change\":0,\"changePercent\":0,\"iexMarketPercent\":0,\"iexVolume\":0,\"avgTotalVolume\":9152221,\"iexBidPrice\":0,\"iexBidSize\":0,\"iexAskPrice\":0,\"iexAskSize\":0,\"marketCap\":44980129645,\"peRatio\":-44.29,\"week52High\":387.46,\"week52Low\":244.5901,\"ytdChange\":-0.16026054430543013}},\"BABA\":{\"quote\":{\"symbol\":\"BABA\",\"companyName\":\"Alibaba Group Holding Limited\",\"primaryExchange\":\"New York Stock Exchange\",\"sector\":\"Consumer Cyclical\",\"calculationPrice\":\"previousclose\",\"open\":174.45,\"openTime\":1553520605088,\"close\":178.77,\"closeTime\":1553544062053,\"high\":178.9,\"low\":174.1,\"latestPrice\":178.77,\"latestSource\":\"Previous close\",\"latestTime\":\"March 25, 2019\",\"latestUpdate\":1553472000000,\"latestVolume\":81509,\"iexRealtimePrice\":0,\"iexRealtimeSize\":0,\"iexLastUpdated\":0,\"delayedPrice\":178.77,\"delayedPriceTime\":1553544062053,\"extendedPrice\":179.42,\"extendedChange\":0.65,\"extendedChangePercent\":0.00364,\"extendedPriceTime\":1553605202906,\"previousClose\":178.77,\"change\":0,\"changePercent\":0,\"iexMarketPercent\":0,\"iexVolume\":0,\"avgTotalVolume\":11909319,\"iexBidPrice\":0,\"iexBidSize\":0,\"iexAskPrice\":0,\"iexAskSize\":0,\"marketCap\":463404779803,\"peRatio\":46.55,\"week52High\":211.7,\"week52Low\":129.77,\"ytdChange\":0.3077542062911487}}}"
    Après avoir fait ceci juste pour vérifier le contenu > dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(RESP);

    J'obtiens 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
    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    {{
      "AAPL": {
        "quote": {
          "symbol": "AAPL",
          "companyName": "Apple Inc.",
          "primaryExchange": "Nasdaq Global Select",
          "sector": "Technology",
          "calculationPrice": "previousclose",
          "open": 191.54,
          "openTime": 1553520601056,
          "close": 188.74,
          "closeTime": 1553544000372,
          "high": 191.98,
          "low": 186.6,
          "latestPrice": 188.74,
          "latestSource": "Previous close",
          "latestTime": "March 25, 2019",
          "latestUpdate": 1553472000000,
          "latestVolume": 573874,
          "iexRealtimePrice": 0,
          "iexRealtimeSize": 0,
          "iexLastUpdated": 0,
          "delayedPrice": 188.74,
          "delayedPriceTime": 1553544000372,
          "extendedPrice": 191.107,
          "extendedChange": 2.367,
          "extendedChangePercent": 0.01254,
          "extendedPriceTime": 1553605243451,
          "previousClose": 188.74,
          "change": 0,
          "changePercent": 0,
          "iexMarketPercent": 0,
          "iexVolume": 0,
          "avgTotalVolume": 27162094,
          "iexBidPrice": 0,
          "iexBidSize": 0,
          "iexAskPrice": 0,
          "iexAskSize": 0,
          "marketCap": 889961947200,
          "peRatio": 15.9,
          "week52High": 233.47,
          "week52Low": 142,
          "ytdChange": 0.20028872050392552
        }
      },
      "TSLA": {
        "quote": {
          "symbol": "TSLA",
          "companyName": "Tesla Inc.",
          "primaryExchange": "Nasdaq Global Select",
          "sector": "Consumer Cyclical",
          "calculationPrice": "previousclose",
          "open": 260,
          "openTime": 1553520600327,
          "close": 260.42,
          "closeTime": 1553544000391,
          "high": 263.18,
          "low": 254.46,
          "latestPrice": 260.42,
          "latestSource": "Previous close",
          "latestTime": "March 25, 2019",
          "latestUpdate": 1553472000000,
          "latestVolume": 90208,
          "iexRealtimePrice": 0,
          "iexRealtimeSize": 0,
          "iexLastUpdated": 0,
          "delayedPrice": 260.42,
          "delayedPriceTime": 1553544000391,
          "extendedPrice": 263.6,
          "extendedChange": 3.18,
          "extendedChangePercent": 0.01221,
          "extendedPriceTime": 1553605243308,
          "previousClose": 260.42,
          "change": 0,
          "changePercent": 0,
          "iexMarketPercent": 0,
          "iexVolume": 0,
          "avgTotalVolume": 9152221,
          "iexBidPrice": 0,
          "iexBidSize": 0,
          "iexAskPrice": 0,
          "iexAskSize": 0,
          "marketCap": 44980129645,
          "peRatio": -44.29,
          "week52High": 387.46,
          "week52Low": 244.5901,
          "ytdChange": -0.16026054430543013
        }
      },
      "BABA": {
        "quote": {
          "symbol": "BABA",
          "companyName": "Alibaba Group Holding Limited",
          "primaryExchange": "New York Stock Exchange",
          "sector": "Consumer Cyclical",
          "calculationPrice": "previousclose",
          "open": 174.45,
          "openTime": 1553520605088,
          "close": 178.77,
          "closeTime": 1553544062053,
          "high": 178.9,
          "low": 174.1,
          "latestPrice": 178.77,
          "latestSource": "Previous close",
          "latestTime": "March 25, 2019",
          "latestUpdate": 1553472000000,
          "latestVolume": 81509,
          "iexRealtimePrice": 0,
          "iexRealtimeSize": 0,
          "iexLastUpdated": 0,
          "delayedPrice": 178.77,
          "delayedPriceTime": 1553544062053,
          "extendedPrice": 179.42,
          "extendedChange": 0.65,
          "extendedChangePercent": 0.00364,
          "extendedPriceTime": 1553605202906,
          "previousClose": 178.77,
          "change": 0,
          "changePercent": 0,
          "iexMarketPercent": 0,
          "iexVolume": 0,
          "avgTotalVolume": 11909319,
          "iexBidPrice": 0,
          "iexBidSize": 0,
          "iexAskPrice": 0,
          "iexAskSize": 0,
          "marketCap": 463404779803,
          "peRatio": 46.55,
          "week52High": 211.7,
          "week52Low": 129.77,
          "ytdChange": 0.30775420629114869
        }
      }
    }}

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 895
    Points : 1 911
    Points
    1 911
    Par défaut
    Je vois que dans le second extrait de code il y a des doubles {{ mais ça me parait suspect, à vérifier si ce n'est pas une erreur de copier / coller. Quoi qu'il en soit en première analyse je dirais qu'il te faut un objet pour représenter une cotation (enfin je suppose que c'est quelque chose comme ça, sous la forme d'un objet simple avec des propriétés en lecture/écriture pour chaque champ à mapper (et a priori c'est bien ce que tu as fait) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Quote
    {
      string Symbol { get; set; }
      string CompanyName { get; set; }
      // et plein d'autres choses
    }
    La casse n'est pas importante mais il faut respecter les noms de champs / propriétés.

    Ensuite on pourrait penser à un objet qui possède des propriétés de type Quote, mais je pense que ta liste n'est pas fixe et est générée à la volée, comme un tableau d'items. Dans ce cas un Dictionary<string, Quote> devrait faire l'affaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dictionary<string, Quote> quotes = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, Quote>>(RESP);
    Après je ne sais pas si ce dictionnaire est bien en racine des données renvoyées ou s'il est lui-même encapsulé dans un autre.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 247
    Points : 106
    Points
    106
    Par défaut
    Curieusement les doubles {{ sont bien là ce n'est pas une erreur copier/coller

    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    …
     
    Dictionary<string, StockQuote> quotes = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, StockQuote>>(RESP);
     
    foreach (var item in quotes)
    {
      richTextBox1.AppendText(string.Format("symbol               : {0}\r\ncompanyName          : {1}\r\n", item.Key, item.Value.companyName));
    }
     
    …
    et avec la classe StockQuote défini comme ceci
    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
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace IEX_Stock_Data
    {
        public class Rootobject
        {
            public string symbol { get; set; }
            public string companyName { get; set; }
            public string primaryExchange { get; set; }
            public string sector { get; set; }
            public string calculationPrice { get; set; }
            public float open { get; set; }
            public long openTime { get; set; }
            public float close { get; set; }
            public long closeTime { get; set; }
            public float high { get; set; }
            public float low { get; set; }
            public float latestPrice { get; set; }
            public string latestSource { get; set; }
            public string latestTime { get; set; }
            public long latestUpdate { get; set; }
            public int latestVolume { get; set; }
            public int iexRealtimePrice { get; set; }
            public int iexRealtimeSize { get; set; }
            public int iexLastUpdated { get; set; }
            public float delayedPrice { get; set; }
            public long delayedPriceTime { get; set; }
            public float extendedPrice { get; set; }
            public float extendedChange { get; set; }
            public float extendedChangePercent { get; set; }
            public long extendedPriceTime { get; set; }
            public float previousClose { get; set; }
            public float change { get; set; }
            public float changePercent { get; set; }
            public int iexMarketPercent { get; set; }
            public int iexVolume { get; set; }
            public int avgTotalVolume { get; set; }
            public int iexBidPrice { get; set; }
            public int iexBidSize { get; set; }
            public int iexAskPrice { get; set; }
            public int iexAskSize { get; set; }
            public long marketCap { get; set; }
            public float peRatio { get; set; }
            public float week52High { get; set; }
            public int week52Low { get; set; }
            public float ytdChange { get; set; }
        }
    }
    Effectivement la collection comporte bien 3 enregistrements avec chaque Dictionary.Key égal à mes stocks symbol c.a.d. AAPL,TSLA,BABA mais les valeurs des autres champs comme
    companyName etc. ne sont pas initialisés et les noms sont pourtant correct.

    J'avais pensé contourner le problème avec regEx je pourrais faire un foreach match(…) sur le résultat, l'expression régulière serait facile à écrire.

    Merci.

Discussions similaires

  1. Conversion de date dans une requête
    Par snoopy69 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 11/08/2006, 09h28
  2. [Tableaux] Passer un tableau dans une requête HTTP ??
    Par haffouff dans le forum Langage
    Réponses: 2
    Dernier message: 09/05/2006, 18h17
  3. Réponses: 1
    Dernier message: 21/03/2006, 15h29
  4. Parser une requête HTTP/GET en c ! regex ?
    Par canard75 dans le forum C
    Réponses: 14
    Dernier message: 06/12/2005, 11h08
  5. [HTTP]Créer une requête http multipart/related
    Par jothi35 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 05/04/2005, 16h32

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