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