Heim >Backend-Entwicklung >C++ >Wie kann ich das standardmäßige JSON-Serialisierungsverhalten in benutzerdefinierten JsonConvertern beibehalten?

Wie kann ich das standardmäßige JSON-Serialisierungsverhalten in benutzerdefinierten JsonConvertern beibehalten?

Linda Hamilton
Linda HamiltonOriginal
2025-01-10 09:08:42511Durchsuche

How Can I Preserve Default JSON Serialization Behavior in Custom JsonConverters?

Standardserialisierungsüberschreibung im benutzerdefinierten JsonConverter

Frage

Wie kann das standardmäßige Serialisierungsverhalten in einem benutzerdefinierten System.Text.Json.JsonConverter ohne benutzerdefinierte Schreiblogik beibehalten werden?

Beschreibung

JsonConverter-Auswahlmöglichkeiten haben unterschiedliche Prioritäten, darunter:

  • Funktionen auf Attributebene
  • Konverter zur Konverter-Sammlung hinzugefügt
  • Attribute, die für benutzerdefinierte Werttypen oder POCOs gelten
  • Der von der Konverterfabrik zurückgegebene Konverter

Lösung

Je nachdem, wie der Konverter angewendet wird, gibt es verschiedene Möglichkeiten, die Standardserialisierung zu implementieren:

Funktionen auf Attributebene

Rufen Sie JsonSerializer.Serialize(writer, person, options) auf, um eine Standardserialisierung zu generieren.

Konverter in der Konverter-Sammlung

  • Kopiert die übergebenen Optionen und entfernt den Konverter aus der Konverterliste der Kopie.
  • Geänderte Optionen an JsonSerializer.Serialize übergeben(Utf8JsonWriter, T, JsonSerializerOptions);
  • Hinweis: Diese Methode ist möglicherweise nicht threadsicher und kann Probleme mit rekursiven Typen verursachen.

Benutzerdefinierter Werttyp oder POCO

  • Derzeit wird die Generierung der Standardserialisierung für Konverter, die auf benutzerdefinierte Werttypen oder POCOs angewendet werden, nicht unterstützt.

Konverterfabrik

  • Verwenden Sie DefaultConverterFactory, um einen Konverter zu erstellen, der die Standardserialisierung generiert.
  • Geänderte Optionen in hergestellten Konvertern zwischenspeichern, die keine Konverter enthalten.

Beispiel

Hier ist ein Beispiel mit einer Konverterfabrik:

<code class="language-csharp">public sealed class PersonConverter : DefaultConverterFactory<Person>
{
    ...

    protected override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions modifiedOptions)
        => (T)JsonSerializer.Deserialize(ref reader, typeToConvert, modifiedOptions);

    protected override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions modifiedOptions) 
        => JsonSerializer.Serialize(writer, value, modifiedOptions);
}

...

var person = new Person("John", "Doe");
var options = new JsonSerializerOptions { Converters = { new PersonConverter() } };
var json = JsonSerializer.Serialize(person, options);</code>

Wichtiger Hinweis

  • Das direkte Anwenden von DefaultConverterFactory auf einen benutzerdefinierten Werttyp oder POCO führt zu einem Stapelüberlauf.
  • Die Verwendung von JsonSerializer.Serialize(writer, person, options); führt zu einer Standardserialisierung, wenn ein Konverter auf Eigenschaften auf Eigenschaftsebene angewendet wird.

Das obige ist der detaillierte Inhalt vonWie kann ich das standardmäßige JSON-Serialisierungsverhalten in benutzerdefinierten JsonConvertern beibehalten?. 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