개발/C#&unity

Newtonsoft.Json 사용시 생성자에서 리스트를 초기화할때 중복으로 들어가는 문제

로 얄 2024. 2. 17. 21:12
반응형

개인적으로 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