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
DDDoriginal
2024-12-27 17:30:111010parcourir

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

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);
        }
    }
  2. Ajouter une action Modificateurs :

    var resolver = new DefaultJsonTypeInfoResolver();
    resolver.Modifiers.Add(typeInfo =>
    {
        // Modify the default JsonTypeInfo here
    });
  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);
        }
    }

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,
};

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