Serializzare e deserializzare un oggetto in .NET 5
In .NET 5 per serializzare o deserializzare un oggetto in JSON è stato introdotto il nuovo namespace System.Text.Json come alternativa alla libreria esterna di Newtonsoft.
Il nuovo namespace promette migliori performace.
dove la t di text è minuscola
si nota che il campo Id viene correttamente serializzato mentre il campo text è vuoto (null).
Questo standard è definito camelCase.
Il comportamento può essere cambiato settando la proprietà PropertyNamingPolicy
Il nuovo namespace promette migliori performace.
Serializzazione
La serializzazione di un oggetto in una stringa avviene tramite il metodo System.Text.Json.JsonSerializer.Serialize(obj)C#: Serializzazione
using System.Text.Json;
// oggetto da serializzare
var obj = new Tag
{
Id = 1,
Text = ".Net 5"
};
var jsonString = JsonSerializer.Serialize(obj);
Console.WriteLine($"Json: {jsonString}");
// risultato => Json: {"Id":1,"Text":".Net 5"}
Deserializzazione
La deserializzazione in oggetto partendo da una stringa avviene tramite il metodo System.Text.Json.JsonSerializer.Deserialize<T>(string)C#: Deserializzazione
var objFromJson = JsonSerializer.Deserialize<Tag>(jsonString);
Console.WriteLine($"Id: {objFromJson.Id}, Text: {objFromJson.Text}");
// risultato => Id: 1, Text: .Net 5
Attenzione la serializzazione e deserializzazione è case sensitive.
Case sensitive
Come dicevo sopra, la serializzazione è case sensitive, infatti deserializzando una stringa come la seguenteC#: Case sensitive
// la 't' di 'text' è minuscola
jsonString = "{\"Id\":1,\"text\":\".Net 5\"}";
C#: Case sensitive
var objFromJson = JsonSerializer.Deserialize<Tag>(jsonString);
Console.WriteLine($"Id: {objFromJson.Id}, Text: {objFromJson.Text}");
// risultato => Id: 1, Text: => *** Text è vuoto ***
Configurazione
E' possibile cambiare il comportamento standard passando un parametro di tipo JsonSerializerOptionsC#: Case sensitive con options
// opzioni di serializzazione/deserializzazione
var jsonOptions = new JsonSerializerOptions()
{
PropertyNameCaseInsensitive = true,
};
jsonOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter());
// deserializzazione con options
var objFromJson = JsonSerializer.Deserialize<Tag>(jsonString, jsonOptions);
Console.WriteLine($"Id: {objFromJson.Id}, Text: {objFromJson.Text}");
// risultato => Id: 1, Text: .Net 5 => adesso funziona, è case sensitive
CamelCase
C'è ancora un problema, l'oggetto serializzato non è nello standard comunemente usato in JavaScript, dove i nomi delle proprietà iniziano con una minuscola e ogni volta che cambia parola la lettera iniziale è maiuscola.Questo standard è definito camelCase.
Il comportamento può essere cambiato settando la proprietà PropertyNamingPolicy
C#: Serializzazione con options
// opzioni case insensitive e camel case
var jsonOptions = new JsonSerializerOptions()
{
PropertyNameCaseInsensitive = true,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
jsonOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter());
var jsonString = JsonSerializer.Serialize(obj, jsonOptions);
Console.WriteLine($"Json: {jsonString}");
// risultato => Json: {"id":1,"text":".Net 5"}