프로그래밍/C#

[C#] Newtonsoft JsonConverter 사용하기

흔한티벳여우 2022. 3. 30. 09:24
반응형

 C# 개발자에겐 거의 필수적으로 사용되는 Newtonsoft.json은 Json data를 직렬화 및 역직렬화를 제공하는 강력한 오픈 소스다. 이번은 JsonConverter에 대해 설명을 해보고자 한다. 

 직렬화와 역직렬화를 사용할 때, 받은 데이터를 혹은 내보내는 데이터를 다른 형태로 바꿀 일이 종종 생긴다. 그럼 굳이 받은 데이터를 하나하나 얻어서 새로운 객체를 만드는 코드를 집어 넣지 않고, 아래와 같이 JsonConverter를 사용하여 바로 처리 가능하다.

[JsonConverter(typeof(TestConverter))]
public class ClassA
{
    public double A1 { get; set; }
    public double A2 { get; set; }
    public double A3 { get; set; }
}

public class ClassB : ClassA
{
    public double B1 { get; set; }
    public double B2 { get; set; }
}

public class TestConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        //return objectType == typeof(ClassA);
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);

        return new ClassB
        {
            B1 = jo["A1"].Value<double>() * Math.PI,
            B2 = jo["A2"].Value<double>() * jo["A3"].Value<double>()
        };
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        ClassA classA = value as ClassA;
        writer.WriteStartObject();
        foreach (var prop in classA.GetType().GetProperties())
        {
            writer.WritePropertyName(prop.Name);
            writer.WriteValue(prop.GetValue(value));
        }
        writer.WriteEndObject();
    }
}

 

ClassA test = new ClassA() { A1 = 1, A2 = 2, A3 = 3 };
var json = JsonConvert.SerializeObject(test);
var classB = JsonConvert.DeserializeObject<ClassA>(json);
Console.ReadKey();

 

반응형

'프로그래밍 > C#' 카테고리의 다른 글

[C#] Class & Struct Performance Test  (0) 2022.12.13
[C#] Oracle Bulk Insert  (0) 2022.04.01
[C#] Oracle 연결 시 예외 발생 문제  (0) 2022.03.11
[C#] Eager & Short-circuit operators  (0) 2022.02.25
[C#] 배열 복사 성능 평가  (0) 2022.02.08