>백엔드 개발 >C++ >System.Text.Json의 `IJsonTypeInfoResolver`가 `IContractResolver`의 기능을 달성할 수 있습니까?

System.Text.Json의 `IJsonTypeInfoResolver`가 `IContractResolver`의 기능을 달성할 수 있습니까?

DDD
DDD원래의
2024-12-27 17:30:111015검색

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

System.Text.Json이 IContractResolver를 모방할 수 있습니까?

System.Text.Json 네임스페이스에서 계약 사용자 정의는 .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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.