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
'programing' 카테고리의 다른 글
React에서 페이지 번호부여를 구현하는 방법 (0) | 2023.02.15 |
---|---|
ESLint 기본 내보내기 Import/prefer-default-export 선호 (0) | 2023.02.15 |
사용자 이름과 비밀번호를 사용하여 MongoDB를 보호하는 방법 (0) | 2023.02.15 |
현재 페이지가 wordpress에서 플러그인 관리 패널인지 확인하는 방법 (0) | 2023.02.15 |
왜 GWT일까요?이 RIA Framework를 사용할 경우의 장점과 단점 (0) | 2023.02.15 |