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.

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 seguente
C#: Case sensitive
// la 't' di 'text' è minuscola
jsonString = "{\"Id\":1,\"text\":\".Net 5\"}";
dove la t di text è minuscola
C#: Case sensitive
var objFromJson = JsonSerializer.Deserialize<Tag>(jsonString);

Console.WriteLine($"Id: {objFromJson.Id}, Text: {objFromJson.Text}");
// risultato => Id: 1, Text:  => *** Text è vuoto ***
si nota che il campo Id viene correttamente serializzato mentre il campo text è vuoto (null).

Configurazione

E' possibile cambiare il comportamento standard passando un parametro di tipo JsonSerializerOptions
C#: 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"}
Potrebbe interessarti anche: