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.
관련 단계는 다음과 같습니다.
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 && 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); }
public enum Example { Trick, Treat, [EnumMember(Value = "Trick-Or-Treat")] TrickOrTreat, }
var options = new JsonSerializerOptions { Converters = { new JsonEnumMemberStringEnumConverter() }, // Set other options as required: WriteIndented = true, }; var json = JsonSerializer.Serialize(values, options);
이 답변을 참조하세요. 수행 방법에 대한 지침에 대한 Mani Gandham의 질문 this.
참고:
이 설명이 도움이 되기를 바랍니다! 다른 질문이 있으면 알려주세요.
위 내용은 System.Text.Json에서 Enum 값에 대한 사용자 정의 이름을 지정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!