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"}
Tags:
JavaScript184 JSON31 .NET 55 .NET Core26
Potrebbe interessarti anche: