System.Text.Json & DeserializeAsync

System.Text.Json & DeserializeAsync

AGGIORNAMENTO NET5: Vi segnalo che e’ presente una versione dello stesso articolo aggiornato sfruttando le novita’ del nuovo NET5. NET5: System.Net.Http.Json & ReadFromJsonAsync

L’esistenza di System.Text.Json non e’ una novita’. I piu’ attenti ricorderanno la sua origine da NETCore 3.0. Ammetto che per pigrizia non l’ho mai usato avendo in tutti i miei progetti il nuget di newtonsoft. L’altra sera pero’ mi ha preso la voglia di sperimentarlo ed in meno che non si dica ho deciso di rimuovere il nuget dalla mia solution. Come passo successivo ho scritto questa classe HttpClientHelper per ottenere leggere i json chiamando le API e tipizzandoli.

HttpClientHelper

La classe HttpClientHelper e’ molto semplice e contiene (al momento) solamente due tipologie di Get

  • public async Task<IEnumerable> GetIEnumerableAsync(string url)
  • public async Task GetAsync(string url)

Inutile spiegarvi la differenza del valore di ritorno. Credo che la presenza o meno della parola magica IEnumerable abbastanza significativa.

 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
public class HttpClientHelper : IDisposable
{
    public void Dispose()
    {
    }

    public async Task<IEnumerable<T>> GetIEnumerableAsync<T>(string url)
    {
        using (HttpClient client = new HttpClient())
        {
            var request = new HttpRequestMessage(HttpMethod.Get, url);
            using (var response = await client.SendAsync(request))
            {
                if (response.IsSuccessStatusCode)
                {
                    using (var stream = await response.Content.ReadAsStreamAsync())
                    {
                        var items = await JsonSerializer.DeserializeAsync<IEnumerable<T>>(stream);
                        return items;
                    }
                }
            }
        }

        return default(IEnumerable<T>);
    }

    public async Task<T> GetAsync<T>(string url)
    {
        using (HttpClient client = new HttpClient())
        {
            var request = new HttpRequestMessage(HttpMethod.Get, url);
            using (var response = await client.SendAsync(request))
            {
                if (response.IsSuccessStatusCode)
                {
                    using (var stream = await response.Content.ReadAsStreamAsync())
                    {
                        var items = await JsonSerializer.DeserializeAsync<T>(stream);
                        return items;
                    }
                }
            }
        }

        return default(T);
    }
}

Per ogni Get esistono due tipologie di valori di ritorno

IsSuccessStatusCodeGetIEnumerableAsyncGetAsync
trueIEnumerableT
falsedefault(IEnumerable)default(T)

In questo modo -se per qualsiasi motivo- il valore di IsSuccessStatusCode risultasse false sappiamo che valore aspettare nel chiamante.

Di seguito propongo due snippet di codice che utilizzano la classe HttpClientHelper appena scritta.

GetIEnumerableAsync

1
2
3
4
5
6
7
8
public async Task<IEnumerable<CustomDTO>> GetCustomDTOsAsync()
{
    using (HttpClientHelper h = new HttpClientHelper())
    {
        var result = await h.GetIEnumerableAsync<CustomDTO>(urlAzureFunction);
        return result;
    }            
}

GetIEnumerableAsync

1
2
3
4
5
6
7
8
public async Task<CustomDTO> GetCustomDTOAsync()
{
    using (HttpClientHelper h = new HttpClientHelper())
    {
        var result = await h.GetAsync<CustomDTO>(urlAzureFunction);
        return result;
    }            
}

Youtube

System.Text.Json &amp; DeserializeAsync:

Note Finali

Alla stesura del post avevo messo come nota finale queste righe

Se vi e’ piaciuto l’articolo oppure ha suscitato il vostro interesse vi consiglio di seguire il blog perche’ nel breve verra’ scritto un nuovo articolo sempre sullo stesso argomento. Curiosi? Ho capito, cerchero’ di farlo il prima possibile!

Ora -a distanza di pochi giorni- aggiorno il tutto con questo passaggio. Ecco la novita’ tanto attesa …

AGGIORNAMENTO NET5: Vi segnalo che e’ presente una versione dello stesso articolo aggiornato sfruttando le novita’ del nuovo NET5. NET5: System.Net.Http.Json & ReadFromJsonAsync