Neu in .NET 8.0 [27]: Konfigurierbare Namenskonventionen in System.Text.Json 8.0

In der JSON-Bibliothek können Entwicklerinnen und Entwickler nun neben CamelCasing auch andere Namenskonventionen wählen.

In Pocket speichern vorlesen Druckansicht

(Bild: Shutterstock.com/calimedia)

Lesezeit: 1 Min.
Von
  • Dr. Holger Schwichtenberg

Der JSON-Serializer System.Text.Json (NuGet-Paket) erhielt in Version 8.0 einige Erweiterungen.

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

Im Gegensatz zu anderen Teilen von .NET 8.0 wie Entity Framework Core 8.0 läuft System.Text.Json nicht nur auf .NET 8.0, sondern auch älteren .NET-Versionen. System.Text.Json funktioniert mit dem klassischen .NET Framework ab Version 4.6.2 und dem modernen .NET ab Version 2.0.

Die Serie zu den Neuerungen in .NET 8.0

Version 8.0 verwendet für die Serialisierung von Objekteigenschaften nach JSON und die Deserialisierung aus JSON die Namenskonventionen KebabCaseLower, KebabCaseUpper, SnakeCaseLower und SnakeCaseUpper in der Enumeration JsonNamingPolicy als Alternative zum bisher fest gesetzten CamelCasing.

Beispiele für diese Namenskonventionen sind:

  • PascalCase: FullName
  • CamelCase: fullName
  • KebabCaseLower: full-name
  • KebabCaseUpper: FULL-NAME
  • SnakeCaseLower: full_name
  • SnakeCaseUpper: FULL_NAME

Im folgenden Listing kommt KebabCaseUpper beim Serialisieren und Deserialisieren einer Instanz der Klasse Consultant zum Einsatz:

var options = new JsonSerializerOptions
{
 // NEU: Enumeration JsonNamingPolicy mit Namenskonventionen KebabCaseLower, KebabCaseUpper, SnakeCaseLower und SnakeCaseUppter als Alternative zum bisher fest gesetzten CamelCase
 PropertyNamingPolicy = JsonNamingPolicy.KebabCaseUpper, // Standard ist CamelCase
};
…
var consultant = new Consultant() { ID = 42, FullName = "Holger Schwichtenberg", Salutation = "Dr.", PersonalWebsite = "www.dotnet-doktor.de" };
consultant.Languages.AddRange(["C#", "JavaScript", "TypeScript"]);
consultant.Address = new Address() { City = "Essen", Country = "Germany" };
Console.WriteLine("Objekt im RAM:");
Console.WriteLine(consultant);
Console.WriteLine();
 
CUI.H3("Serialisierung (KebabCaseUpper):");
string json1 = JsonSerializer.Serialize(consultant, options);
Console.WriteLine(json1); // {"ID":42,"FULL-NAME":"Holger Schwichtenberg","SALUTATION":"Dr.","PERSONAL-WEBSITE":"www.dotnet-doktor.de"}
…
CUI.H3("\nDeserialisierung: (vollständig)");
try
 {
  var jsonString = """
  {"ID":42,"FULL-NAME":"Holger Schwichtenberg","SALUTATION":"Dr.",
   "PERSONAL-WEBSITE":"www.dotnet-doktor.de",
   "ADDRESS":{"COUNTRY":"Germany","CITY":"Essen"}}
  """;
  Console.WriteLine(jsonString);
  var obj = JsonSerializer.Deserialize<Consultant>(jsonString, options);
  if (obj != null) CUI.Success(obj.ToString());
 }
catch (Exception ex)
 {
  CUI.PrintError(ex.Message); 
 }

Das nachstehende Listing 2 zeigt die Datenobjekte Person und Consultant sowie deren Schnittstellen:

using System.Text.Json.Serialization;
 
namespace FCL_JSON;
 
public interface IBusinessObject
{
 UInt128 ID { get; init; } 
}
 
public interface IPerson : IBusinessObject
{
 string? Salutation { get; set; }
 string? FullName { get; set; }
 public Address Address { get; set; }
}
 
public interface IConsultant : IPerson
{
 string? PersonalWebsite { get; set; }
 public List<string> Languages { get; }
}
 
public class Address
{
 public string Country { get; set; }
 public string City { get; set; }
}
 
public class Person : IPerson
{
 public Person() { }
 public required UInt128 ID { get; init; }
 public required string FullName { get; set; }
 public string? Salutation { get; set; }
 public Address Address { get; set; }
 
 public override string ToString()
 {
  return $"Person {ID}: {(!String.IsNullOrEmpty(Salutation) ? Salutation + " " : "")}{FullName} wohnt in {Address?.City ?? "UNBEKANNT"} ";
 }
}
 
public class Consultant : Person, IConsultant
{
 public Consultant() { }
 
 public List<string> Languages { get; } = new();
 
 public string? PersonalWebsite { get; set; }
 
 public override string ToString()
 {
  return $"Consultant {ID}: {(!String.IsNullOrEmpty(Salutation) ? Salutation + " " : "")}{FullName} wohnt in {Address.City} -> {PersonalWebsite} Sprachen: {String.Join('+', Languages)}";
 }
}
Online-Konferenz zu .NET 9.0 am 19. November
betterCode() .NET 9.0 Online-Konferenz 19. November 2024

(Bild: Dmytro Vikarchuk/Shutterstock)

In der Online-Konferenz betterCode() .NET 9.0 am 19. November 2024 von iX und dpunkt.verlag präsentieren .NET-Experten von www.IT-Visions.de den fertigen Stand von .NET 9.0 anhand von Praxisbeispielen. Dazu zählen die Neuerungen in .NET 9.0 SDK, C# 13.0, ASP.NET Core 9.0, Blazor 9.0, Windows Forms 9.0, WPF 9.0, WinUI, .NET MAUI 9.0 und die Integration von Künstlicher Intelligenz in .NET-Anwendungen. Das Programm bietet sechs Vorträge, eine Diskussion und sechs Workshops.

Tickets sind zum Frühbucherpreis erhältlich.

(rme)