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
DDDOriginal
2024-12-27 17:30:111015Durchsuche

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

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);
        }
    }
  2. Aktion hinzufügen Modifikatoren:

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

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

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!

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