programing

JSON 만드는 법NET String Enum Converter는 하이픈 구분 대소문자를 사용합니다.

megabox 2023. 2. 15. 21:48
반응형

JSON 만드는 법NET String Enum Converter는 하이픈 구분 대소문자를 사용합니다.

다음과 같은 문자열 값을 반환하는 API를 사용합니다.

some-enum-value

저는 이 가치들을 하나의 가치관에 넣으려고 합니다.enum디폴트부터StringEnumConverter이 Converter를 추가 논리로 장식하는 등 내가 원하는 것을 할 수 없다.

값이 올바르게 역직렬화되었는지 확인하려면 어떻게 해야 합니까?

이 일을 완수하기 위한 나의 시험 코드는 다음과 같습니다.
단, 회선

reader = new JsonTextReader(new StringReader(cleaned));

지금까지의 모든 것을 깨뜨리다base.ReadJson문자열을 JSON으로 인식할 수 없습니다.

기존 로직을 모두 구현하지 않고 이 작업을 수행할 수 있는 더 나은 방법이 있을까요?StringEnumConverter?
어떻게 하면 내 접근법을 고칠 수 있을까?

public class BkStringEnumConverter : StringEnumConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.String)
        {
            var enumString = reader.Value.ToString();
            if (enumString.Contains("-"))
            {
                var cleaned = enumString.Split('-').Select(FirstToUpper).Aggregate((a, b) => a + b);
                reader = new JsonTextReader(new StringReader(cleaned));
            }
        }
        return base.ReadJson(reader, objectType, existingValue, serializer);
    }

    private static string FirstToUpper(string input)
    {
        var firstLetter = input.ToCharArray().First().ToString().ToUpper();
        return string.IsNullOrEmpty(input)
            ? input
            : firstLetter + string.Join("", input.ToCharArray().Skip(1));
    }
}

EnumMember 속성을 Enum 값에 추가하여 문제를 해결했습니다.제이슨.NET 디폴트StringEnumConverter이러한 속성을 완벽하게 처리합니다.

예:

public enum MyEnum
{
    [EnumMember(Value = "some-enum-value")]
    SomeEnumValue,
    Value,
    [EnumMember(Value = "some-other-value")]
    SomeOtherValue
}

열거형에서 사용할 수 없는 대시 또는 기타 특수 문자가 있는 경우에만 속성을 지정해야 합니다.대문자와 소문자는StringEnumConverter서비스가 다음과 같은 값을 반환하는 경우someenumvalue열거형에서 이렇게 사용해야 합니다.Someenumvalue괜찮으시다면SomeEnumValue를 사용해 주세요.EnumMember기여하다.서비스 부서에서 이렇게 반품하는 경우someEnumValue그냥 이렇게 쓰면 돼SomeEnumValue(Camel Case를 사용하면 개봉 후 바로 사용할 수 있습니다.텍스트 속성).

변환기 및 기타 설정은 에서 쉽게 지정할 수 있습니다.JsonSerializerSettings.

다음은 제가 직접 사용하는 설정의 예입니다.

new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver(),
    Converters = new List<JsonConverter> { new StringEnumConverter { CamelCaseText = true } },
    NullValueHandling = NullValueHandling.Ignore
};

다음 코드도 사용할 수 있습니다.

[JsonConverter(typeof(StringEnumConverter))]
public enum ResposeStatus
{
    [EnumMember(Value = "success value")]
    Success,
    [EnumMember(Value = "fail value")]
    Fail,
    [EnumMember(Value = "error value")]
    Error
};

시리얼화 시JsonConvert.Serialize()는 내부 텍스트를 사용합니다.EnumMember.

이것은 Json에서 더 쉬워졌습니다.NET 12.0.1 (에 추가) :

신기능 - StringEnumConverter에 NamingStrategy 지원이 추가되었습니다.

그리고 Json.NET 12.0.3은 다음과 같은 하이픈 구분 케밥 케이스에 추가되어 있습니다.some-enum-value:

신기능 - Kebab Case Naming Strategy 추가

에 대한 주석은 전혀 필요 없습니다.MyEnum이 접근방식으로요.

구체적으로는 12.0.3 이후에는KebabCaseNamingStrategy몇 명의 건설자 중 한 명에게StringEnumConverter변환기 구성 및 추가 시:

var settings = new JsonSerializerSettings
{
    Converters = { new StringEnumConverter(new KebabCaseNamingStrategy()) },
};
var json = JsonConvert.SerializeObject(MyEnum.SomeEnumValue, settings);

Assert.IsTrue(json == "\"some-enum-value\""); // Passes successfully

이렇게 하면 일련화된 열거형 값이 케밥 캐싱됩니다.1번 바이올린을 시연해 보세요.

인제이슨.NET 12.0.1 및 12.0.2를 서브클래스로 분류함으로써 독자적인 케밥 케이스 명명 전략을 정의할 수 있습니다.

public class KebabCaseNamingStrategy : SnakeCaseNamingStrategy
{
    protected override string ResolvePropertyName(string name)
    {
        return base.ResolvePropertyName(name).Replace('_', '-');
    }
}

2번 바이올린을 시연해 보세요.

또, 다음의 방법을 사용할 수도 있습니다.

public static string GetDescription(this Enum member)
        {
            if (member.GetType().IsEnum == false)
                throw new ArgumentOutOfRangeException(nameof(member), "member is not enum");

            var fieldInfo = member.GetType().GetField(member.ToString());

            if (fieldInfo == null)
                return null;

            var attributes = fieldInfo.GetCustomAttributes<DescriptionAttribute>(false).ToList();

            return attributes.Any() ? attributes.FirstOrDefault()?.Description : member.ToString();
        }

또는

public static string GetDescription(this object member)
        {
            var type = member.GetType();

            var attributes = type.GetCustomAttributes<DescriptionAttribute>(false).ToList();

            return attributes.Any() ? attributes.FirstOrDefault()?.Description : member.GetType().Name;
        }

및 enum에는 desction 속성이 있어야 합니다.다음과 같이 합니다.

public enum MyEnum
    {
        [Description("some-enum-value")]
        And,
        [Description("some-enum-value")]
        Or

    }

그 때 하실 수 .enum음음음같 뭇매하다

MyEnum.GetDescription(); //return "some-enum-value"

언급URL : https://stackoverflow.com/questions/22908204/how-to-make-json-net-stringenumconverter-use-hyphen-separated-casing

반응형