Maison > développement back-end > C++ > Le « IJsonTypeInfoResolver » de System.Text.Json peut-il atteindre la fonctionnalité de « IContractResolver » ?

Le « IJsonTypeInfoResolver » de System.Text.Json peut-il atteindre la fonctionnalité de « IContractResolver » ?

DDD
Libérer: 2024-12-27 17:30:11
original
998 Les gens l'ont consulté

Can System.Text.Json's `IJsonTypeInfoResolver` Achieve the Functionality of `IContractResolver`?

System.Text.Json peut-il imiter IContractResolver ?

Dans l'espace de noms System.Text.Json, la personnalisation des contrats est très attendue dans .NET 7 et est actuellement disponible dans Aperçu 6. Les métadonnées de contrat pour un type spécifique, représenté par JsonTypeInfo, peuvent désormais être personnalisées par développeurs.

public interface IJsonTypeInfoResolver
{
    JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options);
}
Copier après la connexion

Création d'un IJsonTypeInfoResolver personnalisé

Voici quelques méthodes pour créer votre IJsonTypeInfoResolver personnalisé :

  1. Sous-classe DefaultJsonTypeInfoResolver :

    public class CustomJsonTypeInfoResolver : DefaultJsonTypeInfoResolver
    {
        public override JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options)
        {
            // Implement your custom logic here
            return base.GetTypeInfo(type, options);
        }
    }
    Copier après la connexion
  2. Ajouter une action Modificateurs :

    var resolver = new DefaultJsonTypeInfoResolver();
    resolver.Modifiers.Add(typeInfo =>
    {
        // Modify the default JsonTypeInfo here
    });
    Copier après la connexion
  3. Créer un nouveau IJsonTypeInfoResolver :

    public class CustomJsonTypeInfoResolver : IJsonTypeInfoResolver
    {
        public JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options)
        {
            // Implement your custom logic here
            return new JsonTypeInfo(type, JsonTypeInfoKind.Object);
        }
    }
    Copier après la connexion

Utilisation Votre résolveur personnalisé

Une fois que vous avez un résolveur personnalisé, définissez-le via JsonSerializerOptions.TypeInfoResolver.

Exemple

L'exemple suivant montre comment créer un DefaultJsonTypeInfoResolver qui sérialise uniquement les champs sélectionnés :

using System.Text.Json.Serialization;

public static class JsonSerializerExtensions
{
    public static DefaultJsonTypeInfoResolver SerializeSelectedFields(this DefaultJsonTypeInfoResolver resolver, IEnumerable<string> membersToSerialize)
    {
        resolver.Modifiers.Add(typeInfo =>
        {
            if (typeInfo.Kind == JsonTypeInfoKind.Object)
            {
                foreach (var property in typeInfo.Properties)
                {
                    if (!membersToSerialize.Contains(property.GetMemberName()))
                        property.ShouldSerialize = static (obj, value) => false;
                }
            }
        });

        return resolver;
    }
}

// Usage
var options = new JsonSerializerOptions
{
    TypeInfoResolver = new DefaultJsonTypeInfoResolver()
        .SerializeSelectedFields("FirstName", "Email", "Id"),
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    WriteIndented = true,
};
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal