Skip to content

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; }
    }