System.Text.Json 名前空間では、コントラクトのカスタマイズが .NET 7 で待望されており、現在は .NET 7 で利用可能です。プレビュー 6. JsonTypeInfo
public interface IJsonTypeInfoResolver { JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options); }
カスタム IJsonTypeInfoResolver の作成
カスタム IJsonTypeInfoResolver を作成するためのいくつかの方法を次に示します。
サブクラスDefaultJsonTypeInfoResolver:
public class CustomJsonTypeInfoResolver : DefaultJsonTypeInfoResolver { public override JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options) { // Implement your custom logic here return base.GetTypeInfo(type, options); } }
アクションの追加
var resolver = new DefaultJsonTypeInfoResolver(); resolver.Modifiers.Add(typeInfo => { // Modify the default JsonTypeInfo here });
新しい 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 サイトの他の関連記事を参照してください。