Heim >Backend-Entwicklung >C++ >Wie deserialisiere ich verschachteltes JSON in ein verschachteltes Wörterbuch mit Typunterscheidung in .NET Core?

Wie deserialisiere ich verschachteltes JSON in ein verschachteltes Wörterbuch mit Typunterscheidung in .NET Core?

DDD
DDDOriginal
2024-12-29 08:04:13933Durchsuche

How to Deserialize Nested JSON into a Nested Dictionary with Type Discrimination in .NET Core?

Deserialisierung von verschachteltem JSON in ein verschachteltes Wörterbuch mit Typunterscheidung

In .NET Core 3.1 bietet System.Text.Json eine Standardmethode zum Deserialisieren von JSON. Standardmäßig werden JSON-Objekte in JsonElement-Objekte deserialisiert, die Zugriff auf die JSON-Datenstruktur bieten, Werte jedoch nicht automatisch in die entsprechenden C#-Typen konvertieren.

Problem:

Das Ziel besteht darin, verschachtelte JSON-Objekte in Dictionary zu deserialisieren, jedoch mit der folgenden Typunterscheidung für JSON-Eigenschaften Werte:

  • Strings als Strings
  • Zahlen als int/double
  • Objekte als Dictionary

Lösung:

Um dies zu erreichen, ein Brauch Der JsonConverter namens ObjectAsPrimitiveConverter ist erforderlich, da System.Text.Json keine sofort einsatzbereiten Funktionen für diese spezielle Typkonvertierung bereitstellt.

Der ObjectAsPrimitiveConverter bietet die folgenden Funktionen:

  • Typbewusst Deserialisierung:

    • Konvertiert Strings als Strings
    • Konvertiert Zahlen als int/double basierend auf einem vom Benutzer konfigurierbaren Format
    • Konvertiert Objekte als Dictionary
  • Zahlenverarbeitung:

    • Unterstützt doppelte oder dezimale Genauigkeit für Gleitkommazahlen
    • Enthält eine Option zum Behandeln nicht unterstützter Zahlen als JsonElements oder Throw Ausnahmen
  • Objektbehandlung:

    • Ermöglicht dem Benutzer die Wahl zwischen der Verwendung von Dictionary oder ExpandoObject für Objekte

Implementierung:

public class ObjectAsPrimitiveConverter : JsonConverter<object>
{
    // Configuration options
    FloatFormat FloatFormat { get; init; }
    UnknownNumberFormat UnknownNumberFormat { get; init; }
    ObjectFormat ObjectFormat { get; init; }

    public ObjectAsPrimitiveConverter()
        : this(FloatFormat.Double, UnknownNumberFormat.Error, ObjectFormat.Expando)
    {
    }

    public ObjectAsPrimitiveConverter(
        FloatFormat floatFormat,
        UnknownNumberFormat unknownNumberFormat,
        ObjectFormat objectFormat)
    {
        this.FloatFormat = floatFormat;
        this.UnknownNumberFormat = unknownNumberFormat;
        this.ObjectFormat = objectFormat;
    }

    // ... implementation details ...
}

public enum FloatFormat
{
    Double,
    Decimal,
}

public enum UnknownNumberFormat
{
    Error,
    JsonElement,
}

public enum ObjectFormat
{
    Expando,
    Dictionary,
}

Verwendung:

Zum Deserialisieren von JSON in ein dynamisches Objekt (oder ExpandoObject, falls konfiguriert) mithilfe von ObjectAsPrimitiveConverter, geben Sie den Konverter in den JsonSerializerOptions wie folgt an:

var options = new JsonSerializerOptions
{
    Converters = { new ObjectAsPrimitiveConverter(floatFormat : FloatFormat.Double, unknownNumberFormat : UnknownNumberFormat.Error, objectFormat : ObjectFormat.Expando) },
    WriteIndented = true,
};
dynamic d = JsonSerializer.Deserialize<dynamic>(json, options);

Hinweise:

  • JSON ermöglicht Zahlen beliebiger Genauigkeit und Größe, während .NET Bei primitiven numerischen Typen ist dies nicht der Fall. In Fällen, in denen eine JSON-Zahl nicht in einen primitiven .NET-Typ geparst werden kann, bietet der Konverter die Option, ein JsonElement für die Zahl zurückzugeben oder eine Ausnahme auszulösen.
  • Der Konverter kann so konfiguriert werden, dass er doppelte oder dezimale Genauigkeit verwendet für Gleitkommazahlen und Dictionary oder ExpandoObject für JSON-Objekte.

Das obige ist der detaillierte Inhalt vonWie deserialisiere ich verschachteltes JSON in ein verschachteltes Wörterbuch mit Typunterscheidung in .NET Core?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn