개인적으로 Newtonsoft.Json은 C#을 사용할 때 거의 항상 사용하게되는 라이브러리다.
이번에 class의 생성자에서 list를 생성하고 초기값을 집어넣는 코드를 넣었는데, json을 Deserialize 할 때, 생성자에서 넣어둔 값이 중복으로 들어가는 문제가 발생했다.
정확히는 생성자에서 넣어둔 초기값이 먼저 들어가고 json Deserialize한 값들이 추가로 들어가는 것을 확인했다.
처음에는 이를 처리하기 위해 아래처럼 우회했다.
public class TestClass
{
public TestClass(bool isInit = false)
{
// 블라블라
}
}
위와 같이 생성자의 파라미터에 초기값을 선언해주고 사용하게 될경우 Deserialize할 때 생성자가 호출되지 않는것을 확인했다.
하지만 좀 더 다른 방법이 있지 않을까 해서 조사를 해본 결과 아래와 같은 방법들이 존재했다.
1. JsonConstructorAttribute
2. ObjectCreationHandling setting
JsonConstructorAttribute
해당 어트리뷰트는 생성자가 여러개로 오버라이드 되어있을 때 json deserialzie시 어떤 생성자를 사용하게 할지 명시적으로 지정해준다.
위와 같은 상황에서 생성자를 오버라이드해 리스트를 초기화하는 코드를 제거할 수 있다. 자세한 내용과 예제 코드는 아래의 문서에서 확인이 가능하다.
* https://www.newtonsoft.com/json/help/html/JsonConstructorAttribute.htm
JsonConstructorAttribute
This sample uses the JsonConstructorAttribute to specify that a constructor should be used to create a class during deserialization.
www.newtonsoft.com
ObjectCreationHandling setting
개인적으로는 해당 방법을 이용하여 해결 했다.
해당 옵션은 Deserialize할 때 오브젝트를 어떻게 관리할지 결정하는 옵션이다.
기본값은 ObjectCreationHandling.Auto 로 오브젝트가 존재하면 재사용하고, 존재하지 않으면 생성한다.
해당 옵션을 ObjectCreationHandling.Replace 로 변경하게 되면 새로 생성하여 사용하게 된다.
자세한 내용과 예제 코드는 아래의 문서에서 확인가능하다.
* https://www.newtonsoft.com/json/help/html/DeserializeObjectCreationHandling.htm
ObjectCreationHandling setting
This sample deserializes JSON with ObjectCreationHandling set to Replace so that collection values aren't duplicated.
www.newtonsoft.com
'개발 > C#&unity' 카테고리의 다른 글
C# 반올림, 올림, 버림 (0) | 2024.03.09 |
---|---|
C# JsonConverter 사용 (0) | 2024.02.17 |