Abstraktes Header-Bild in den Farben von tsjdev apps

Blogbeitrag

Eigener Json-Converter für Array/List/Object

Bei C# handelt es sich um eine stark typisierte Programmiersprache, dass bedeutet, dass ein Variablentyp bekannt sein muss und sich dieser auch zur Laufzeit nicht ändern kann. Nun kann es jedoch vorkommen, dass die JSON-Struktur manchmal eine Liste von Objekten und manchmal nur ein einzelnen Objekt beinhaltet. Wenn man nun versucht dieses zu deserialisieren, stößt man auf ein Problem. Denn der Datentyp ist nicht mehr eindeutig und daher kann er nicht konvertiert werden. Ich möchte hier nun zeigen, wie man einen eigenen Json-Converter mit Newtonsoft.JSON schreiben kann, welcher dieses beschriebene Problem umgeht.

Zunächst möchte ich ein einfache Beispiel für eine Json-Struktur liefern, welche das Problem verdeutlicht.

[
    {
        "title": "My Title",
        "genre": "Action"
    },
    {
        "title": "My Other Title",
        "genre": [
            "Action",
            "Thriller"
        ]
    }
]

Der Objekt Genre ist entweder ein String oder eine Liste von Strings. Damit die Deserialisierung nun mit Newtonsoft.JSON funktioniert, schreiben wir einen Converter. Dieses wollen wir SingleValueArrayConverter nennen und hat die folgende Struktur.

public class SingleValueArrayConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, 
      object existingValue, JsonSerializer serializer)
    {
        var retVal = new object();

        switch (reader.TokenType)
        {
            case JsonToken.StartObject:
                var instance = (T)serializer.Deserialize(reader, typeof(T));
                retVal = new List<T> { instance };
                break;
            case JsonToken.StartArray:
                var lst = serializer.Deserialize(reader, objectType);
                retVal = lst;
                break;
        }

        return retVal;
    }

    public override void WriteJson(JsonWriter writer, object value, 
      JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

Um diesen Converter nur verwenden zu können, muss dieser bei der Definition der Datenstruktur mit angegeben werden. Für unser kleines JSON-Beispiel ergibt sich nun der folgende Aufbau.

public class MyObject
{
    [JsonConverter(typeof(SingleValueArrayConverter<string>))]
    [JsonProperty("genre")]
    public List<string> Genre { get; set; }

    [JsonProperty("title")]
    public string Title { get; set; }
}

Wie man diesem Beispiel entnehmen kann, geben wir nun immer eine Liste von Einträgen zurück, wobei diese Liste auch nur ein Element enthalten kann, wenn in der JSON-Struktur nur ein einzelner String bzw. Objekt angegeben ist.

Weiterempfehlen

Diesen Beitrag teilen

Wenn dir der Beitrag gefallen hat: gern weiterreichen. Gute Links dürfen sich ruhig schnell verbreiten.

Vorheriger/Nächster Beitrag

NuGet: what3words Vorheriger Beitrag NuGet: what3words echosim.io - Alexa im Browser Nächster Beitrag echosim.io - Alexa im Browser
Flags Quiz - Ein interaktives Flaggen-Quiz mit HTML, JavaScript und Bulma Flags Quiz - Ein interaktives Flaggen-Quiz mit HTML, JavaScript und Bulma Sicherheitslücken in verwendeten NuGet-Paketen finden Sicherheitslücken in verwendeten NuGet-Paketen finden Windows Terminal unter Windows 11 mit Oh-My-Posh einrichten Windows Terminal unter Windows 11 mit Oh-My-Posh einrichten Cronjobs in Azure Functions: Zeitgesteuerte Aufgaben mit dem TimerTrigger ausführen Cronjobs in Azure Functions: Zeitgesteuerte Aufgaben mit dem TimerTrigger ausführen
Lust auf ein kurzes digitales Hallo? Wenn du eine Idee teilen, eine Frage loswerden oder ein Projekt anschieben willst: mein Posteingang ist deutlich zuverlässiger als Brieftauben. apps@tsjdev-apps.de Mail schicken