[C#] 동적으로 구성되는 Json 역직렬화 - Custom JsonConverter 작성하기

우롱밀크티당도70·2024년 5월 27일
1

C#

목록 보기
2/3
post-thumbnail
post-custom-banner

2024.06.03 수정했습니다.

1. 배경

이 글에서 동적으로 Key가 추가되는 구조의 Json Object를 역직렬화하는 방법에 대한 내용을 작성했는데 여기에 Custom JsonConverter를 작성하는 내용을 추가 작성한다.


2. 개발환경

  • VisualStudio 2022 / WPF 애플리케이션(.NET Framework 4.7.2)

3. 내용

다음과 같은 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 위에 추가한다.


4. 결과

Temps안의 Address Count = 2

하나씩 살펴보면 Address_1, Address_2가 담긴 것을 확인할 수 있다.


5. 참조


profile
안뇽하세용
post-custom-banner

2개의 댓글

comment-user-thumbnail
2024년 5월 29일

오랜만입니다 밀크티님! 언뜻 보기에는 Dictionary의 T1 타입이 String이라 Custom Converter를 작성하지 않아도 역직렬화가 가능해 보이는데 정확한 이유가 있을까요?

1개의 답글