JSON-Eigenschaften als Werte statt als Objekte serialisieren/deserialisieren: Eine ausführliche Anleitung
In vielen Anwendungen werden Daten im JSON-Format dargestellt für effiziente Speicherung und Übertragung. Allerdings stimmt die Standard-JSON-Darstellung manchmal nicht mit unserem gewünschten Format überein. Dies kann insbesondere beim Umgang mit benutzerdefinierten Datentypen der Fall sein. In diesem Artikel untersuchen wir ein Problem, mit dem Programmierer beim Serialisieren/Deserialisieren von Klassen mit Eigenschaften benutzerdefinierter Datentypen konfrontiert sind, und wie man es lösen kann.
Problemstellung
Bedenken Sie den folgenden Code:
class Car { public StringId Id { get; set; } public string Name { get; set; } } class StringId { public string Value { get; set; } }
Wenn wir versuchen, ein Objekt der Car-Klasse zu serialisieren, erwarten wir möglicherweise den folgenden JSON Darstellung:
{ "Id": "someId", "Name": "Ford" }
Das Standardverhalten in JSON.NET führt jedoch zu einer anderen Darstellung:
{ "Id" : { "Value": "someId" }, "Name": "Ford" }
Dies liegt daran, dass die StringId-Eigenschaft als Objekt statt als einfaches serialisiert wird Wert.
Lösung 1: Verwenden eines TypeConverters
Eine Möglichkeit zur Lösung Dieses Problem besteht darin, einen TypeConverter für die StringId-Klasse zu erstellen. JSON.NET erkennt und verwendet diesen Konverter automatisch, wenn Objekte serialisiert/deserialisiert werden. So implementieren Sie einen TypeConverter für StringId:
[TypeConverter(typeof(StringIdConverter))] class StringId { public string Value { get; set; } } class StringIdConverter : TypeConverter { // Implementation of CanConvertFrom, CanConvertTo, ConvertFrom, and ConvertTo methods }
Dieser TypeConverter ermöglicht JSON.NET, StringId-Objekte in und aus Strings zu konvertieren.
Lösung 2: Verwenden eines benutzerdefinierten JsonConverter
Ein alternativer Ansatz ist die Verwendung eines benutzerdefinierten JsonConverters. Dies bietet eine bessere Kontrolle über den Serialisierungs-/Deserialisierungsprozess. So implementieren Sie einen benutzerdefinierten JsonConverter für StringId:
[JsonConverter(typeof(StringIdConverter))] class StringId { public string Value { get; set; } } class StringIdConverter : JsonConverter { // Implementation of CanConvert, ReadJson, and WriteJson methods }
Mit diesem JsonConverter können wir genau angeben, wie StringId-Objekte in JSON dargestellt werden sollen.
Zusätzliche Überlegungen
Es ist wichtig zu beachten, dass Typkonverter nur in .NET Core für JSON.NET unterstützt werden 10.0.1 und höher. Für ältere Versionen sollten stattdessen benutzerdefinierte JsonConverter verwendet werden.
Das obige ist der detaillierte Inhalt vonWie serialisiere/deserialisiere ich JSON-Eigenschaften als Werte anstelle von Objekten in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!