JsonConverter
JsonConverter
erlauben bei der Json-De/Serialisierung das Mapping zu von der C# Struktur zum Json zu beeinflussen.
ItemsConverter
Dieser Converter kann gebraucht werden um bei der Deserlisierung mit ToObject<T>
von einem JToken
zu einer C#-Datenklasse das Zwischenarray "items" wegzulasseen.
Das GraphQL-Resultat von Liste von Childobjekten hat das Zwischenobjekt "items".
...
"dokumente": {
"items": [
{
"guid": "9eb83d8b668c42dc9eccdfe63107dc13",
...
},
{
...
}
]
}
...
Damit es in C# kein Items-Array-Zwischenobjekt braucht, kann der ItemsConverter<T>
mit dem JsonConverterAttribute
auf dem Property gesetzt werden.
public class Aktivitaet
{
...
[JsonConverter(typeof(ItemsConverter<Dokument>))]
public Dokument[] Dokumente { get; set; }
...
}
Hat diese Aktivität keine Dokumente, so ist das Array leer.
SkipIntermediateConverter
Dieser Converter kann gebraucht werden um bei der Deserialisierung ein Zwischenobjekt zu "überspringen".
Eine Anwendung ist, um die GraphQL-Abfrage der letzten Original-Rendition von einem Dokument. Das Resultat einer solchen Abfrage hat max. 1 Rendition:
...
"dokumente": {
"items": [
{
"guid": "9eb83d8b668c42dc9eccdfe63107dc13",
"titel": "Protokollauszug",
"eDokument": {
"renditions": [
{
"file": "http://localhost:20984/api/core/Dms/Download?objGuid=9eb83d8b668c42dc9eccdfe63107dc13&fldId=332&version=1&renditionGuid=00000000000000000000000000000000",
"fileName": "Protokollauszug.docx"
}
]
}
}
]
}
...
Um das Zwischen-Array "renditions" auf der C#-Klasse wegzulassen, kann der SkipIntermediateConverter<T>
mit dem JsonConverterAttribute
angegebene werden:
public class Dokument
{
...
[JsonConverter(typeof(SkipIntermediateConverter<Rendition>), new object[] {"renditions"})]
public Rendition EDokument { get; set; }
}
Ist das renditions-Array leer, so ist das Property EDokument null.
Damit dieses Attribut etwas "kompakter" wird, kann folgende Hilfsklasse erstellt werden:
public class RendererConverter: SkipIntermediateConverter<Rendition>
{
public RendererConverter() : base("renditions") {}
}
Die C#-Datenklasse sieht dann wie folgt aus:
public class Dokument
{
...
[JsonConverter(typeof(RendererConverter))]
public Rendition EDokument { get; set; }
}
RendererConverter
ist nicht Teil der Library, da die Ausprägung von Renditions
abhängig von der Abfrage ist.
DateTimeParseConverter
Dieser Converter kann gebraucht werden um verschiedene Datum-Formate in ein DateTime-Object zu parsen.
Es muss ein bool
übergeben werden, welches steuert ob die UTC-Time genommen wird.
Eine Anwendung ist, CreationDate sowie Modificationdate richtig in ein DateTime-Objekt zu deserialisieren:
public class Dokument : IDokumenteExplorerChild
{
[JsonConverter(typeof(DateTimeParseConverter), false)]
public DateTime? Creationdate { get; set; }
[JsonConverter(typeof(DateTimeParseConverter), true)]
public DateTime? Modificationdate { get; set; }
}