Negli script #563 e #565 abbiamo visto alcune tecniche per gestire il polimorfismo durante la fase di serializzazione di un oggetto utilizzando la libreria System.Text.Json. Tutti questi approcci prevedevano l'uso delle funzionalità integrate della libreria. In questo script analizziamo invece una funzionalità che ci permette di alterare il modo in cui la libreria serializza un oggetto e quind grazie alla quale possiamo gestire manualmente il processo di serializzazione: i converter.
Per creare un converter dobbiamo creare una classe che eredita da JsonConverter<T> dove T è la classe base della gerarchia per cui creiamo il converter. Una volta creata la classe, dobbiamo eseguire l'override della proprietà CanConvert e dei metodi Read (usato per deserializzare l'oggetto) e Write (usato per serializzare l'oggetto).
public class Vehicle { public string Name { get; set; } } public class Car : Vehicle { public int Doors { get; set; } } public class Train : Vehicle { public int Coaches { get; set; } } public class VehicleConverter : JsonConverter<Vehicle> { public override bool CanConvert(Type typeToConvert) => typeof(Vehicle).IsAssignableFrom(typeToConvert); public override Vehicle Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { throw new NotImplementedException(); } public override void Write(Utf8JsonWriter writer, Vehicle vehicle, JsonSerializerOptions options) { writer.WriteStartObject(); if (vehicle is Car c) { writer.WriteNumber(nameof(c.Doors), c.Doors); } else if (vehicle is Train t) { writer.WriteNumber(nameof(t.Coaches), t.Coaches); } writer.WriteString(nameof(vehicle.Name), vehicle.Name); writer.WriteEndObject(); } }
La proprietà CanConvert torna true se l'oggetto passato in input eredita da Vehicle, mentre il metodo Read è commentato perché ne parleremo in un prossimo script. Il metodo su cui ci concentriamo è Write il quale prende in input l'oggetto Vehicle e il writer in cui scrivere i dati. All'interno del metodo verifichiamo il tipo dell'oggetto in input e scriviamo nel writer le relative proprietà.
Per utilizzare il converter durante la serializzazione, dobbiamo creare un oggetto JsonSerializerOptions, aggiungerci il converter e passare l'oggetto al metodo Serialize.
var c = new Car { Doors = 2, Name = "mycar" }; var serializeOptions = new JsonSerializerOptions(); serializeOptions.Converters.Add(new VehicleConverter()); Console.WriteLine(JsonSerializer.Serialize(c, serializeOptions));
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Usare il colore CSS per migliorare lo stile della pagina
Utilizzare Copilot con Azure Cosmos DB
Ottimizzare le pull con Artifact Cache di Azure Container Registry
Estrarre dati randomici da una lista di oggetti in C#
Eseguire query per recuperare il padre di un record che sfrutta il tipo HierarchyID in Entity Framework
Gestire la cancellazione di una richiesta in streaming da Blazor
Utilizzare gRPC su App Service di Azure
Utilizzare Hybrid Cache in .NET 9
Collegare applicazioni server e client con .NET Aspire
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Effettuare il refresh dei dati di una QuickGrid di Blazor
Ottenere un token di accesso per una GitHub App
I più letti di oggi
- a #RealCodeConf4 il 25 maggio a Firenze parleremo di #silverlight4. iscrizioni gratis su http://u.aspitalia.com/g9
- Parallelizzare le chiamate HTTP con async/await e le Promise in JavaScript
- #HTML5 schema per avere l'intellisense su #VS2008 (anche express) http://u.aspitalia.com/ed
- Rendere sicuro l'endpoint di HealthCheck in ASP.NET Core
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!