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
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Configurare policy CORS in Azure Container Apps
Implementare il throttling in ASP.NET Core
Le novità di Angular: i miglioramenti alla CLI
Utilizzare database e servizi con gli add-on di Container App
Ottimizzare la latenza in Blazor 8 tramite InteractiveAuto render mode
Creazione di plugin per Tailwind CSS: espandere le funzionalità del framework dinamicamente
Determinare lo stato di un pod in Kubernetes
Effettuare il binding di date in Blazor
.NET Conference Italia 2023
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Creare un'applicazione React e configurare Tailwind CSS
I più letti di oggi
- ASP.NET Core Identity 8: è rivoluzione?
- Tutorial ASP.NET Dynamic Data Control
- Accesso dai dati con Entity Framework 7
- Utilizzare la classe XmlDataDocument per leggere un Feed RSS
- Microsoft Security Bulletin MS08-067
- Le novità di ASP.NET 4.5
- Mostrare tutti i cookie creati in fase di debug
- MIX 2011: Tutte le novità dei tool di ASP.NET MVC 3
- Usare il sensore di luminosità ambientale nelle Universal App