https://github.com/HeadspringLabs/Enumeration 을 구현하려고합니다 . 현재 열거 형을 직렬화 / 역 직렬화하려고 할 때 복잡한 개체처럼 직렬화합니다. 예를 들어, 개체 색상 :
public class Color : Enumeration<Color, int>
{
public static readonly Color Red = new Color(1, "Red");
public static readonly Color Blue = new Color(2, "Blue");
public static readonly Color Green = new Color(3, "Green");
private Color(int value, string displayName) : base(value, displayName) { }
}
직렬화됩니다
{
"_value": 2,
"_displayName": "Something"
}
다음과 같은 복잡한 개체에서 :
public class OtherClass
{
public Color Color {get; set;}
public string Description {get; set;}
}
다음과 같이 직렬화됩니다.
{
"Description" : "Other Description",
"Color" :
{
"_value": 2,
"_displayName": "Something"
}
}
json이 다음과 같이 복잡한 객체를 직렬화하도록 변환하는 방법이 있습니까?
{
"Description" : "Other Description",
"Color" : 2
}
Enumeration 클래스의 FromValue 메서드를 사용하여 값에서 올바른 Color 개체를 만들 수 있습니다. 그냥 json 변환이 속성 값을 Color 개체의 "값"으로 사용하도록 만들 수없는 것 같습니다.
이를 달성하기 위해 변환기의 WriteJson 및 Create 메서드를 어떤 방식으로 작성할 수 있습니까?
public class EnumerationConverter : JsonCreationConverter<IEnumeration>
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
}
protected override IEnumeration Create(Type objectType, JObject jObject)
{
}
}
다음 Headspring.Enumeration<T, int>
과 같이 파생 클래스에 대한 일반 변환기를 만들 수 있습니다 .
class EnumerationConverter<T> : JsonConverter where T : Headspring.Enumeration<T, int>
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(T);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
int val = Convert.ToInt32(reader.Value);
return Headspring.Enumeration<T, int>.FromValue(val);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var enumVal = (Headspring.Enumeration<T, int>)value;
writer.WriteValue(enumVal.Value);
}
}
변환기를 사용하려면 [JsonConverter]
다음과 같이 enum 클래스에 속성을 추가 하십시오.
[JsonConverter(typeof(EnumerationConverter<Color>))]
public class Color : Headspring.Enumeration<Color, int>
{
public static readonly Color Red = new Color(1, "Red");
public static readonly Color Blue = new Color(2, "Blue");
public static readonly Color Green = new Color(3, "Green");
private Color(int value, string displayName) : base(value, displayName) { }
}
다음은 왕복 데모입니다. https://dotnetfiddle.net/CZsQab
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다