2024.06.03 수정했습니다.
이 글에서 동적으로 Key가 추가되는 구조의 Json Object를 역직렬화하는 방법에 대한 내용을 작성했는데 여기에 Custom JsonConverter를 작성하는 내용을 추가 작성한다.
다음과 같은 Json Object가 존재한다.
{
"FirstName" : "James",
"LastName" : "Newton-King",
"Temps" : {
"Age" : "38",
"Adress_1" : {
"PhoneNumber" : "000-0000-0000",
"FAX" : "000-000-0000"
},
"Adress_2" : {
"PhoneNumber" : "111-1111-1111",
"FAX" : "111-111-1111"
}
}
}
이대로만 Class를 만들면 될 것 같지만 문제는 Temps 안의 Address_로 시작하는 Key는 Address_1 하나일 수도 있고 _2, _3...등 여러 개가 될 수도 있다.
"Adress_1" : {
"PhoneNumber" : "000-0000-0000",
"FAX" : "000-000-0000"
},
"Adress_2" : {
"PhoneNumber" : "111-1111-1111",
"FAX" : "111-111-1111"
},
"Adress_3" : {
"PhoneNumber" : "222-2222-2222",
"FAX" : "222-222-2222"
}
.
.
.
그럴때 class는 다음과 같이 작성하고
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Temp Temps { get; set; }
}
public class Temp {
public string Age { get; set; }
public Dictionary<string, Address> Address { get; set; }
}
public class Address
{
public string PhoneNumber { get; set; }
public string FAX { get; set; }
}
JsonConverter를 작성한다.
Json 문서의 이름 구조가 Address_ 일 것을 염두에 두고 작성한다.
ReadJson에서 Json Object의 Property 중 이름이 Address_로 시작하는 것을 찾아서 Key와 Value를 Add한다.
foreach (var property in jObject.Properties())
{
if (property.Name.StartsWith("Adress_"))
{
var propertyName = property.Value.ToObject<Address>();
temp.Address.Add(property.Name, propertyName);
}
}
JsonConverter를 Dictionary Roles 위에 추가한다.
Temps안의 Address Count = 2
하나씩 살펴보면 Address_1, Address_2가 담긴 것을 확인할 수 있다.
오랜만입니다 밀크티님! 언뜻 보기에는 Dictionary의 T1 타입이 String이라 Custom Converter를 작성하지 않아도 역직렬화가 가능해 보이는데 정확한 이유가 있을까요?