Heim > Backend-Entwicklung > C++ > Kann „IJsonTypeInfoResolver' von System.Text.Json die Funktionalität von „IContractResolver' erreichen?

Kann „IJsonTypeInfoResolver' von System.Text.Json die Funktionalität von „IContractResolver' erreichen?

DDD
Freigeben: 2024-12-27 17:30:11
Original
998 Leute haben es durchsucht

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

Kann System.Text.Json IContractResolver nachahmen?

Im System.Text.Json-Namespace wird die Vertragsanpassung in .NET 7 mit Spannung erwartet und ist derzeit in verfügbar Vorschau 6. Vertragsmetadaten für einen bestimmten Typ, dargestellt durch JsonTypeInfo, können jetzt angepasst werden durch Entwickler.

public interface IJsonTypeInfoResolver
{
    JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options);
}
Nach dem Login kopieren

Erstellen eines benutzerdefinierten IJsonTypeInfoResolvers

Hier sind einige Methoden zum Erstellen Ihres benutzerdefinierten IJsonTypeInfoResolvers:

  1. Unterklasse DefaultJsonTypeInfoResolver:

    public class CustomJsonTypeInfoResolver : DefaultJsonTypeInfoResolver
    {
        public override JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options)
        {
            // Implement your custom logic here
            return base.GetTypeInfo(type, options);
        }
    }
    Nach dem Login kopieren
  2. Aktion hinzufügen Modifikatoren:

    var resolver = new DefaultJsonTypeInfoResolver();
    resolver.Modifiers.Add(typeInfo =>
    {
        // Modify the default JsonTypeInfo here
    });
    Nach dem Login kopieren
  3. Neuen IJsonTypeInfoResolver erstellen:

    public class CustomJsonTypeInfoResolver : IJsonTypeInfoResolver
    {
        public JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options)
        {
            // Implement your custom logic here
            return new JsonTypeInfo(type, JsonTypeInfoKind.Object);
        }
    }
    Nach dem Login kopieren

Verwenden Ihr benutzerdefinierter Resolver

Sobald Sie Wenn Sie einen benutzerdefinierten Resolver haben, legen Sie ihn über JsonSerializerOptions.TypeInfoResolver fest.

Beispiel

Das folgende Beispiel zeigt, wie ein DefaultJsonTypeInfoResolver erstellt wird, der nur ausgewählte Felder serialisiert:

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,
};
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonKann „IJsonTypeInfoResolver' von System.Text.Json die Funktionalität von „IContractResolver' erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage