.NET Core 3.0'da tanıtılan yeni JSON serileştirme System.Text.Json Sürüm 7.0'dan, Serileştirmenin uyarlanabilirliğini söz konusu Bilgilerin Çözücüleri aracılığıyla sunar. Bu şekilde .NET sınıfını söz konusu olacak. Bu, .NET (De-) Seryalizasyon sınıfı kaynak kodda mevcut değilse kullanışlıdır.
Holger Schwichtenberg, 53 ünlü uzmanla tavsiye ve eğitim yoluyla ve yazılımın geliştirilmesinde çok sayıda orta ve büyük şirketi destekleyen uzmanlar ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası uzman konferansındaki görünümleri, 90'dan fazla uzman kitabı ve 1.500'den fazla uzman makalesi sayesinde Holger Schwichtenberg, Almanya'daki .NET ve Web teknikleri için en iyi uzmanlardan biridir.
System.Text.Json Bir Nueget paketi olarak .NET 7.0 ile birlikte yayınlandı, ancak .NET Standard 2.0'da ve bu nedenle 4.6.2 sürümünden klasik .NET çerçevesinde .NET çekirdeği 2.x/3RDX ve .NET 5.0/.NET 6.0'da da çalışır.
Listedeki program kodu bunu garanti ediyor
/// <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ı, tür bilgilerinin çözümleyicisini kullanmanın başka yollarıyla ilgilidir.
(RME)

Holger Schwichtenberg, 53 ünlü uzmanla tavsiye ve eğitim yoluyla ve yazılımın geliştirilmesinde çok sayıda orta ve büyük şirketi destekleyen uzmanlar ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası uzman konferansındaki görünümleri, 90'dan fazla uzman kitabı ve 1.500'den fazla uzman makalesi sayesinde Holger Schwichtenberg, Almanya'daki .NET ve Web teknikleri için en iyi uzmanlardan biridir.
System.Text.Json Bir Nueget paketi olarak .NET 7.0 ile birlikte yayınlandı, ancak .NET Standard 2.0'da ve bu nedenle 4.6.2 sürümünden klasik .NET çerçevesinde .NET çekirdeği 2.x/3RDX ve .NET 5.0/.NET 6.0'da da çalışır.
Listedeki program kodu bunu garanti ediyor
- Sınıf serileştirme ve arzulandırma durumunda Punkt Mülkiyet Memo göz ardı edilir ve
- Xey koordinatları (her ikisi de bir dizi “int” türü gibi) “123” ve “456” gibi dizelerle de istenebilir.
/// <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ı, tür bilgilerinin çözümleyicisini kullanmanın başka yollarıyla ilgilidir.
(RME)