Maison > développement back-end > C++ > Comment puis-je conserver le comportement de sérialisation System.Text.Json par défaut lors de l'implémentation d'un JsonConverter personnalisé ?

Comment puis-je conserver le comportement de sérialisation System.Text.Json par défaut lors de l'implémentation d'un JsonConverter personnalisé ?

Linda Hamilton
Libérer: 2025-01-10 07:24:42
original
821 Les gens l'ont consulté

How Can I Preserve Default System.Text.Json Serialization Behavior When Implementing a Custom JsonConverter?

Personnaliser la sérialisation System.Text.Json tout en conservant le comportement par défaut

Question :

Lors de l'implémentation d'un System.Text.Json.JsonConverter personnalisé pour les mises à niveau du modèle de données, comment puis-je conserver le comportement de sérialisation par défaut dans la méthode Write() sans affecter les autres options de sérialisation ?

Réponse :

Pour conserver le comportement de sérialisation par défaut dans la méthode Write() d'un System.Text.Json.JsonConverter personnalisé, vous pouvez utiliser la stratégie suivante :

Option 1 : Utiliser [JsonConverter] sur l'attribut

  • Appliquez l'attribut [JsonConverter] à une propriété spécifique.
  • Appeler JsonSerializer.Serialize() sans fournir d'options personnalisées générera une sérialisation par défaut.

Option 2 : Modifier la collection de convertisseurs

  • Dans la méthode Write(), créez une copie des options transmises et supprimez le convertisseur personnalisé de la collection Converters.
  • Transmettez les options modifiées dans les appels JsonSerializer imbriqués.

Option 3 : implémenter DefaultConverterFactory

  • Définissez une fabrique de convertisseurs personnalisée (par exemple, DefaultConverterFactory) qui encapsule un convertisseur par défaut.
  • La méthode CanConvert() de l'usine détermine si le convertisseur est applicable.
  • La méthode CreateConverter() de l'usine crée un convertisseur en utilisant des options modifiées (à l'exclusion des convertisseurs personnalisés).

Limitations :

  • L'option 3 ne fonctionne pas avec les types de valeurs personnalisés ou les POCO qui ont un attribut [JsonConverter] sur leur type lui-même.
  • Les types récursifs peuvent causer des problèmes car les options modifiées ne sont pas appliquées de manière cohérente.

Exemple :

<code class="language-csharp">public sealed class PersonConverter : DefaultConverterFactory<Person>
{
    public override Person Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions modifiedOptions)
    {
        // 自定义读取实现
    }
}

public abstract class DefaultConverterFactory<T> : JsonConverterFactory
{
    public override bool CanConvert(Type typeToConvert) => typeof(T) == typeToConvert;

    public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
    {
        return new DefaultConverter(options, this);
    }
}

public sealed class DefaultConverter : JsonConverter<Person>
{
    public override void Write(Utf8JsonWriter writer, Person value, JsonSerializerOptions modifiedOptions)
    {
        // 调用默认的 Write 实现
        JsonSerializer.Serialize(writer, value, modifiedOptions);
    }
}</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal