복잡한 유형을 단순 유형으로 직렬화 / 역 직렬화하는 Newtonsoft JSON 변환기를 구현하는 방법

JustM

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관