Neu in .NET 8.0 [31]: Erweiterte Serialisierung in System.Text.Json 8.0
Die JSON-Bibliothek kann nun auch nicht öffentliche Mitglieder serialisieren und deserialisieren.
- Dr. Holger Schwichtenberg
In System.Text.Json
ermöglichen es die Annotationen [JsonInclude]
und [JsonConstructor]
seit Version 8.0, die Serialisierung nicht öffentlicher Klassenmitglieder zu erzwingen.
Für jedes nicht öffentliche Mitglied, das mit [JsonInclude]
annotiert ist, muss im Konstruktor, der mit [JsonConstructor]
annotiert ist, ein Parameter vorhanden sein, um den Wert während der Deserialisierung setzen zu können. Ein aussagekräftiges Beispiel dazu zeigt folgendes Listing:
public class Person
{
[JsonConstructor]
// ohne Annotation: 'Deserialization of types without a
// parameterless constructor, a singular parameterized
// constructor, or a parameterized constructor annotated with
// 'JsonConstructorAttribute' is not supported.
internal Person(int id, string name, string website)
{
ID = id;
Name = name;
Website = website;
}
[JsonInclude]
// ohne Annotation: 'Each parameter in the deserialization
// constructor on type 'FCL_JSON+Person' must bind to an
// object property or field on deserialization. Each parameter
// name must match with a property or field on the object.
// Fields are only considered when
// 'JsonSerializerOptions.IncludeFields' is enabled.
// The match can be case-insensitive.'
internal int ID { get; }
public string Name { get; set; }
[JsonInclude]
// ohne Annotation: 'Each parameter in the deserialization
// constructor on type 'FCL_JSON+Person' must bind to an object
// property or field on deserialization. Each parameter name must
// match with a property or field on the object. Fields are only
// considered when 'JsonSerializerOptions.IncludeFields' is
// enabled. The match can be case-insensitive.'
private string Website { get; set; }
public override string ToString()
{
return $"{this.ID}: {this.Name} ({this.Website})";
}
}
…
// Serialisierung
var p1 = new PersonWithoutParameterlessConstructor
(42, Dr. Holger Schwichtenberg", "www.dotnet-doktor.de");
string json4 = JsonSerializer.Serialize(p1);
Console.WriteLine(json4);
//{ "Name":"Dr. Holger Schwichtenberg","ID":42,"Website":"www.dotnet-doktor.de"}
// Deserialisierung
var p2 =
JsonSerializer.Deserialize<PersonWithoutParameterlessConstructor>(json4);
Console.WriteLine(p2);
//42: Dr.Holger Schwichtenberg (www.dotnet-doktor.de)
(rme)