> 백엔드 개발 > C++ > System.Text.Json에서 Enum 값에 대한 사용자 정의 이름을 지정하는 방법은 무엇입니까?

System.Text.Json에서 Enum 값에 대한 사용자 정의 이름을 지정하는 방법은 무엇입니까?

DDD
풀어 주다: 2025-01-14 10:37:43
원래의
359명이 탐색했습니다.

How to Specify Custom Names for Enum Values in System.Text.Json?

System.Text.Json: 열거형 값에 대한 사용자 정의 이름을 어떻게 지정합니까?

이 기능은 외부에서는 사용할 수 없습니다. .NET Core 3.0, .NET 5, .NET 6.0, .NET 7.0 또는 .NET의 상자 8.0. 따라서 속성으로 지정된 사용자 정의 값 이름으로 열거형을 직렬화하는 자체 JsonConverterFactory를 생성하거나 Macross.Json.Extensions와 같이 동일한 작업을 수행하는 NuGet 패키지를 사용해야 합니다.

.NET 7 이상 또는 이전 버전에서 사용자 정의 이름이 있는 열거형을 직렬화만 하고 역직렬화할 필요는 없는 경우, 사용자 정의 이름은 다음을 생성하여 쉽게 지원할 수 있습니다. 모든 열거형 값에 적용된 [EnumMember(Value = "xxx")]를 사용하여 각 열거형에 대한 사용자 정의 JsonNamingPolicy를 구성하여 JsonStringEnumConverter를 조정하는 JsonConverterFactory.

관련 단계는 다음과 같습니다.

  1. 맞춤 만들기 변환기:
public class JsonEnumMemberStringEnumConverter : JsonConverterFactory
{
    public JsonEnumMemberStringEnumConverter() : this(null, true) { }

    public JsonEnumMemberStringEnumConverter(JsonNamingPolicy? namingPolicy = null, bool allowIntegerValues = true)
    {
        this.namingPolicy = namingPolicy;
        this.allowIntegerValues = allowIntegerValues;
        this.baseConverter = new JsonStringEnumConverter(namingPolicy, allowIntegerValues);
    }

    public override bool CanConvert(Type typeToConvert) => baseConverter.CanConvert(typeToConvert);

    public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
    {
        var query = from field in typeToConvert.GetFields(BindingFlags.Public | BindingFlags.Static)
                    let attr = field.GetCustomAttribute<EnumMemberAttribute>()
                    where attr != null &amp;&amp; attr.Value != null
                    select (field.Name, attr.Value);
        var dictionary = query.ToDictionary(p => p.Item1, p => p.Item2);
        if (dictionary.Count > 0)
            return new JsonStringEnumConverter(new DictionaryLookupNamingPolicy(dictionary, namingPolicy), allowIntegerValues).CreateConverter(typeToConvert, options);
        else
            return baseConverter.CreateConverter(typeToConvert, options);
    }
}

public class JsonNamingPolicyDecorator : JsonNamingPolicy
{
    readonly JsonNamingPolicy? underlyingNamingPolicy;

    public JsonNamingPolicyDecorator(JsonNamingPolicy? underlyingNamingPolicy) => this.underlyingNamingPolicy = underlyingNamingPolicy;
    public override string ConvertName(string name) => underlyingNamingPolicy?.ConvertName(name) ?? name;
}

internal class DictionaryLookupNamingPolicy : JsonNamingPolicyDecorator
{
    readonly Dictionary<string, string> dictionary;

    public DictionaryLookupNamingPolicy(Dictionary<string, string> dictionary, JsonNamingPolicy? underlyingNamingPolicy) : base(underlyingNamingPolicy) => this.dictionary = dictionary ?? throw new ArgumentNullException();
    public override string ConvertName(string name) => dictionary.TryGetValue(name, out var value) ? value : base.ConvertName(name);
}
로그인 후 복사
  1. 열거 장식:
public enum Example
{
    Trick,
    Treat,
    [EnumMember(Value = "Trick-Or-Treat")]
    TrickOrTreat,
}
로그인 후 복사
  1. 사용 변환기 독립 실행형:
var options = new JsonSerializerOptions
{
    Converters = { new JsonEnumMemberStringEnumConverter() },
    // Set other options as required:
    WriteIndented = true,
};
var json = JsonSerializer.Serialize(values, options);
로그인 후 복사
  1. ASP.NET Core에 변환기 등록:

이 답변을 참조하세요. 수행 방법에 대한 지침에 대한 Mani Gandham의 질문 this.

참고:

  • .NET 6 이하에서 JsonStringEnumConverter는 역직렬화 중에 명명 정책을 무시합니다. 이 문제는 풀 요청 73348에서 수정되었습니다.
  • .Net Core 3.x에서는 변환기가 [Flags] 열거형을 사용하여 원하는 대로 작동하지 않을 수 있습니다. 이 문제는 .NET 5의 문제 #31622에서 해결되었습니다.
  • .NET 6 이하에서 사용자 지정 값 이름이 있는 열거형을 왕복해야 하는 경우 다음에서 일반 변환기 변환기 팩터리를 만들어야 합니다. 스크래치.
  • 대체 솔루션은 Macross.Json.Extensions 패키지의 JsonStringEnumMemberConverter를 사용하는 것입니다. 패키지를 설치한 다음 [JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumMemberConverter))] 속성으로 열거형을 장식합니다.

이 설명이 도움이 되기를 바랍니다! 다른 질문이 있으면 알려주세요.

위 내용은 System.Text.Json에서 Enum 값에 대한 사용자 정의 이름을 지정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿