File, bytes & JSON

In questo brevissimo howto vorrei mostrare come ‘trasmettere’ il contenuto di un file serializzato all’interno di un json esposto dalla nostra API. L’idea di mettere questo tips nero su bianco sul mio blog è nata dopo avere letto recentemente il quesito sui social.

Spoiler: prima di giungere a conclusioni affrettate vi consiglio di leggere il tutto sino in fondo.

File & bytes

Esporre il contenuto di un file all’interno di un JSON non è una pratica che amo tanto. Ad essere sinceri posso dire che la evito del tutto. Personalmente -dove possibile- preferisco esporre un url con SAS Token in modo da rendere accessibile il file per un tempo limitato. L’esempio contenuto nel link è vecchio tanto da essere segnato come deprecated il pacchetto usato. Vi prometto una versione aggiornata del contenuto appena possibile.

Dopo questa premessa veniamo al punto di partenza. Come posso fare a passare il contenuto di un file via json? La soluzione è davvero molto semplice e vi riassumo i passaggi alternando descrizione & codice.

Il primo passaggio da fare ovviamente è la lettura del file stesso. Su questa parte non approfondisco il come. Vi lascio divertire in quanto non è lo scopo del tips

1
byte[] bytes = ReadFile(path);

A questo punto siamo al giro di boa. Non dovremo fare altro che convertire il nostro byte[] semplicemente in base64 e magari approfittare del passaggio per creare un dto di tipo Anonymous Types (ricordate che nulla vi vieta di creare una classe dedicata)

1
2
3
4
var dto = new
{
    bytesBase = System.Convert.ToBase64String(bytes)
};

Ed ora? Manca semplicemente il passaggio finale. Serializzare dto per poi restituire il tutto.

1
2
3
4
// net 6
var json = System.Text.Json.JsonSerializer.Serialize(dto);
// newtonsoft
var json = JsonConvert.SerializeObject(dto)

Spoiler

Come dite? Ho scritto troppo codice per nulla? Ecco finalmente giunto lo spoiler annunciato in precedenza.

1
2
3
4
5
6
byte[] bytes = ReadFile(path);

var dto = new
{
    bytes = bytes
};

Come avrete notato manca il passaggio della conversione in formato base64. Ho voluto mostrarvelo nonostante tutto per farvi capire il procedimento per arrivare al risultato finale. Come dite? Non mi credete?

Esempio Reale

Ho capito, vi lascio un esempio di un caso reale di come leggere un immagine presente in rete e scriverla utilizzando entrambe le due strade.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
using (var client = new HttpClient())
{
    var bytesImage = await client.GetByteArrayAsync(urlImage);

    var dtoImage = new
    {
        bytesBase = System.Convert.ToBase64String(bytesImage),
        bytes = bytesImage
    };

    var jsonImage =   System.Text.Json.JsonSerializer.Serialize(dtoImage);

    System.IO.File.WriteAllBytes(pathImageBytes, dtoImage.bytes);


    System.IO.File.WriteAllBytes(pathImageBase64,
        System.Convert.FromBase64String(dtoImage.bytesBase)
    );

}

Quando ho cominciato a scrivere il contenuto non pensavo di farlo completo in questo modo. Siete stati fortunati!

Happy Coding!