JsonConverter.Serialize를 사용하면 Class를 Json으로 변환할 수 있습니다.
하지만 Json으로 변환할때 Class를 명시해줘야 하기 때문에 아래와 같은 경우는 처리하기가 어렵습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class A { public virtual string Type { get; set; } = "A"; public string Parent { get; set; } = "Parent"; } class B : A { public override string Type { get; set; } = "B"; public string Child { get; set; } = "Child"; } List<A> list = new List(){new A(), new B()} foreach(var tmp in list) { if(tmp is A a) { JsonConverter.Serialize<A>(a); } else if(tmp is B b) { JsonConverter.Serialize<B>(b); } } | cs |
위와 같은 코드는 상속받는 클래스가 늘어나면 해당 코드를 변경해야 하기 때문에 관리가 힘듭니다.
아래와 같이 바꾸면 되겠지만 이때 상속 받은 B 클래스가 Json으로 제대로 변환되지 않습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class A { public virtual string Type { get; set; } = "A"; public string Parent { get; set; } = "Parent"; } class B : A { public override string Type { get; set; } = "B"; public string Child { get; set; } = "Child"; } List<A> list = new List(){new A(), new B()} foreach(var tmp in list) { string str = JsonConverter.Serialize<A>(a); Console.WriteLine(str); } | cs |
{"Type":"A","Parent":"Parent"}
{"Type":"B","Parent":"Parent"}
이 문제를 해결하려면 JsonDerivedType Attribute를 추가하여 클래스 A와 B의 상속 관계를 알려줘야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | [JsonDerivedType(typeof(A), typeDiscriminator: "A")] [JsonDerivedType(typeof(B), typeDiscriminator: "B")] class A { public virtual string Type { get; set; } = "A"; public string Parent { get; set; } = "Parent"; } class B : A { public override string Type { get; set; } = "B"; public string Child { get; set; } = "Child"; } List<A> list = new List(){new A(), new B()} foreach(var tmp in list) { string str = JsonConverter.Serialize<A>(a); Console.WriteLine(str); } | cs |
{"$type":"A","Type":"A","Parent":"Parent"}
{"$type":"B","Type":"B","Child":"Child","Parent":"Parent"}
제대로 Json으로 변환되는 것을 확인할 수 있습니다.
또한 JsonSerializer를 사용하면 리스트의 클래스들을 한번에 문자열로 변환할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [JsonDerivedType(typeof(A), typeDiscriminator: "A")] [JsonDerivedType(typeof(B), typeDiscriminator: "B")] class A { public virtual string Type { get; set; } = "A"; public string Parent { get; set; } = "Parent"; } class B : A { public override string Type { get; set; } = "B"; public string Child { get; set; } = "Child"; } List<A> list = new List(){new A(), new B()} #region 클래스 리스트를 문자열로 변환 string str = System.Text.Json.JsonSerializer.Serialize<A>>(list, new JsonSerializerOptions() { WriteIndented = true }); #endregion #region Deserialize로 Json 문자열을 클래스들로 변환 var json = System.Text.Json.JsonSerializer.Deserialize<List<A>>(str); | cs |
댓글
댓글 쓰기