La libreria System.Text.Json (STJ d'ora in poi) è stata inizialmente introdotta con .NET Core 2, ma il suo utilizzo è stato reso difficile dalla mancanza di molte funzionalità rispetto al suo principale concorrente JSON.Net. Una delle principali mancanze della libreria è la complessità nel gestire il polimorfismo durante la serializzazione. Prendiamo il seguente esempio.
abstract class Vehicle { public string Fuel { get; set; } } class Car : Vehicle { public int Doors { get; set; } } class Train : Vehicle { public int Coaches { get; set; } }
Se serializziamo un oggetto il cui tipo è Car o Train, STJ il risultato sarà esattamente quello che ci aspettiamo. Tuttavia, se proviamo a serializzare un oggetto il cui tipo è Vehicle, ma l'istanza reale è di tipo Car o Train, otterremo come risultato un JSON che contiene solo la proprietà della classe base (Fuel).
Vehicle v = new Car() { Fuel = "Oil", Doors = 2 }; JsonSerializer.Serialize(v); //{ "Fuel" : "Oil" } var c = new Car() { Fuel = "Oil", Doors = 2 }; JsonSerializer.Serialize(c); //{ "Fuel" : "Oil", "Doors": 2 }
Se vogliamo serializzare un oggetto con tutte le sue proprietà indipendentemente dal tipo della variabile, abbiamo a disposizione due metodi diversi. il primo consiste nel passare object come parametro generico al metodo Serialize. Il secondo consiste nel passare un secondo parametro al metodo dove specifichiamo il tipo reale da serializzare.
Vehicle v = new Car() { Fuel = "Oil", Doors = 2 }; JsonSerializer.Serialize<object>(v); //{ "Fuel" : "Oil", "Doors": 2 } JsonSerializer.Serialize(v, v.GetType()); //{ "Fuel" : "Oil", "Doors": 2 } var c = new Car() { Fuel = "Oil", Doors = 2 }; JsonSerializer.Serialize(c); //{ "Fuel" : "Oil", "Doors": 2 }
Questo meccanismo vale solamente per l'oggetto che stiamo serializzando. Se l'oggetto contiene proprietà che espongono tipi di che fanno parte di una gerarchia di ereditarietà, di queste verranno serializzate solo le proprietà del tipo specificato. Se ad esempio Car avesse una proprietà di tipo Vehicle, di quella proprietà verrebbe in ogni caso serializzata solo la proprietà Fuel. Nel prossimo script vedremo come superare questo problema.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Paginare i risultati con QuickGrid in Blazor
Creare una libreria CSS universale: Cards
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Creare una libreria CSS universale: Clip-path
Gestione dei nomi con le regole @layer in CSS
La gestione della riconnessione al server di Blazor in .NET 9
Conoscere il rendering Server o WebAssembly a runtime in Blazor
Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Usare le navigation property in QuickGrid di Blazor
Estrarre dati randomici da una lista di oggetti in C#
Ordinare randomicamente una lista in C#
I più letti di oggi
- Creare agenti facilmente con Azure AI Agent Service
- Loggare le query più lente con Entity Framework
- Rendere i propri workflow e le GitHub Action utilizzate più sicure
- Disabilitare le run concorrenti di una pipeline di Azure DevOps
- Fornire parametri ad un Web component HTML
- Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
- Gestione degli eventi nei Web component HTML
- Documentare i servizi REST con Swagger e OpenAPI con .NET 9