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
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 // 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)); } } }
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 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; } }
Maintenant il faut convertir ce résultat en un objet utilisable en C#.
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 } } }}
Partager