Maison >développement back-end >C++ >Comment puis-je conserver le comportement de sérialisation JSON par défaut dans les JsonConverters personnalisés ?

Comment puis-je conserver le comportement de sérialisation JSON par défaut dans les JsonConverters personnalisés ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-10 09:08:42523parcourir

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

Remplacement de la sérialisation par défaut dans JsonConverter personnalisé

Question

Comment conserver le comportement de sérialisation par défaut dans un System.Text.Json.JsonConverter personnalisé sans logique d'écriture personnalisée ?

Description

Les choix de JsonConverter ont des priorités différentes, notamment :

  • Fonctionnalités au niveau de l'attribut
  • Convertisseurs ajoutés à la collection Convertisseurs
  • Attributs qui s'appliquent aux types de valeurs personnalisés ou aux POCO
  • Le convertisseur renvoyé par l'usine du convertisseur

Solution

Il existe différentes manières d'implémenter la sérialisation par défaut en fonction de la manière dont le convertisseur est appliqué :

Fonctionnalités au niveau de l'attribut

Appelez JsonSerializer.Serialize(writer, person, options); générera la sérialisation par défaut.

Convertisseurs dans la collection Convertisseurs

  • Copie les options transmises, en supprimant le convertisseur de la liste des convertisseurs de la copie.
  • Transmettre les options modifiées à JsonSerializer.Serialize(Utf8JsonWriter, T, JsonSerializerOptions);
  • Remarque : Cette méthode peut ne pas être thread-safe et peut causer des problèmes avec les types récursifs.

Type de valeur personnalisé ou POCO

  • Actuellement, la génération d'une sérialisation par défaut pour les convertisseurs appliqués aux types de valeurs personnalisés ou aux POCO n'est pas prise en charge.

Usine de convertisseurs

  • Utilisez DefaultConverterFactory pour créer un convertisseur qui génère une sérialisation par défaut.
  • Cache les options modifiées dans les convertisseurs fabriqués qui ne contiennent pas de convertisseurs.

Exemple

Voici un exemple utilisant une usine de conversion :

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

Remarque importante

  • L'application de DefaultConverterFactory directement à un type de valeur personnalisé ou à POCO entraînera un débordement de pile.
  • L'utilisation de JsonSerializer.Serialize(writer, person, options); entraînera une sérialisation par défaut lors de l'application d'un convertisseur aux propriétés au niveau de la propriété.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn