.NET 7.0’daki yenilikler [22]: Type Info Resolver ile özel JSON serileştirmesi

Womanne

Member
.NET Core 3.0’da kullanıma sunulan en son JSON seri hale getirici System.Text.Json Sürüm 7.0’dan bu yana, serileştirme, Tip Bilgisi Çözümleyicileri aracılığıyla uyarlanabilir. Bu, söz konusu .NET sınıfını değiştirmek zorunda kalmadan seri hale getirmeyi ve serisini kaldırmayı özelleştirmenizi sağlar. Bu, serileştirme (de-) hale getirme .NET sınıfı kaynak kodunda yoksa kullanışlıdır.

Duyuru








Dr Holger Schwichtenberg, güvenlikle ilgili son derece kritik alanlarda bile yenilik ve deneyim odaklı yazılım geliştirme sunan MAXIMAGO’da Baş Teknoloji Uzmanıdır. Aynı zamanda, çok sayıda orta ölçekli ve büyük şirketi yazılım geliştirme ve işletim konusunda 38 tanınmış uzmanla danışmanlık ve eğitimle destekleyen uzman ağı www.IT-Visions.de’nin başkanıdır.







System.Text.Json .NET 7.0 ile birlikte bir NuGet paketi olarak piyasaya sürüldü, ancak aynı zamanda .NET Standard 2.0 altında ve dolayısıyla klasik .NET Framework sürümünde .NET Core 2.x/3.x ve .NET 5.0/.NET 6.0 üzerinde de çalışıyor 4.6.2.

Listedeki program kodu bunu garanti eder.

  • sınıfı seri hale getirirken ve serisini kaldırırken Punkt özellikler Memo yoksayılır
  • X ve Y koordinatlarının (her ikisi de “int” türünde sayılar olarak bildirilir) ayrıca “123” ve “456” gibi karakter dizilerinden seri durumu kaldırılabilir.
Özellikler TypeInfoResolver İçinde JsonSerializerOptions bu tür IJsonTypeInfoResolver.



/// <summary>
/// Zu serialiserende Datenklasse
/// </summary>
public class Point
{
public int X { get; set; }
public int Y { get; set; }
public string Memo { get; set; } = "?";
}

public class FCL_JSON
{
/// <summary>
/// Type Info Resolver = Einflussnahme auf die
/// (De-)Serialisierung, ohne Datenklasse verändern zu müssen
/// Verwendet Datenklasse Point
/// </summary>
public static void JSON_TypeInfoResolver()
{
CUI.H2(nameof(JSON_TypeInfoResolver));

JsonSerializerOptions options = new()
{
TypeInfoResolver = new DefaultJsonTypeInfoResolver()
{
Modifiers =
{
(JsonTypeInfo jsonTypeInfo) =>
{
// Ignoriere alle Properties, die mit "Memo" beginnen
var memoProp =
jsonTypeInfo.Properties.FirstOrDefault(p=>p.Name.StartsWith("Memo"));
if (memoProp != null)
{
jsonTypeInfo.Properties.Remove(memoProp);
}

// Erlaube Zahlen aus Zeichenketten zu deserialisieren
if (jsonTypeInfo.Type == typeof(int))
{
jsonTypeInfo.NumberHandling =
JsonNumberHandling.AllowReadingFromString;
}
}
}
}
};
// Serialisierung

var p1 = new Point() { X = 1, Y = 2, Memo = "Testpunkt" };
var json1 = JsonSerializer.Serialize(p1, options);
Console.WriteLine(json1); // Ausgabe: {"X":1,"Y":2}

// Deserialisierung
string json2 = """
{
"X":"123","Y":"456","Memo":"Testposition"
}
""";
Console.WriteLine("Angepasste Deserialisierung vonn" + json2);
Point? p2 = JsonSerializer.Deserialize<Point>(json2, options);
if (p2 is not null) Console.WriteLine($"({p2.X},{p2.Y},{p2.Memo})");
// Ausgabe: (123,456,?)
}



Bir blog yazısı, Type Info Resolver’ı kullanmanın diğer yollarını kapsar.

Duyuru


(rm)



Haberin Sonu
 
Üst