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

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);
    }
}
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!

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