ホームページ >バックエンド開発 >C++ >System.Text.Json の `IJsonTypeInfoResolver` は `IContractResolver` の機能を実現できますか?

System.Text.Json の `IJsonTypeInfoResolver` は `IContractResolver` の機能を実現できますか?

DDD
DDDオリジナル
2024-12-27 17:30:11998ブラウズ

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

System.Text.Json は IContractResolver を模倣できますか?

System.Text.Json 名前空間では、コントラクトのカスタマイズが .NET 7 で待望されており、現在は .NET 7 で利用可能です。プレビュー 6. JsonTypeInfo で表される特定のタイプのコントラクト メタデータを次のようにカスタマイズできるようになりました。

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

カスタム IJsonTypeInfoResolver の作成

カスタム IJsonTypeInfoResolver を作成するためのいくつかの方法を次に示します。

  1. サブクラスDefaultJsonTypeInfoResolver:

    public class CustomJsonTypeInfoResolver : DefaultJsonTypeInfoResolver
    {
        public override JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options)
        {
            // Implement your custom logic here
            return base.GetTypeInfo(type, options);
        }
    }
  2. アクションの追加修飾子:

    var resolver = new DefaultJsonTypeInfoResolver();
    resolver.Modifiers.Add(typeInfo =>
    {
        // Modify the default JsonTypeInfo here
    });
  3. 新しい IJsonTypeInfoResolver を作成します:

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

を使用しますあなたのカスタムResolver

カスタム リゾルバーを作成したら、JsonSerializerOptions.TypeInfoResolver 経由で設定します。

次の例は、作成方法を示しています。選択されたもののみをシリアル化する DefaultJsonTypeInfoResolverフィールド:

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

以上がSystem.Text.Json の `IJsonTypeInfoResolver` は `IContractResolver` の機能を実現できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。