System.Text.Json의 역직렬화 시 필드/속성 주의
다음은 간단한 System.Text.Json 예제입니다.
using System.Text.Json;
internal class Program
{
private static void Main(string[] args)
{
string text = """
{
"id": "test",
"data": [
{
"id": "test"
}
]
}
""";
DataList? models = JsonSerializer.Deserialize<DataList>(text);
Console.WriteLine(models?.data.Count);
}
}
public class DataList
{
public string id { get; set; } = "";
public List<Data> data { get; set; } = new List<Data>();
}
public class Data
{
public string id { get; set; } = "";
}
그런데, 무심코 이렇게 정의하면 안 됩니다. ^^;
public class DataList
{
public string id { get; set; } = "";
public List<Data> data;
}
그나마 위와 같이 하면 data.Count 접근 시 data가 null이어서 예외가 발생하는데요, 이것을 다음과 같이 바꾸면,
public class DataList
{
public string id { get; set; } = "";
public List<Data> data = new List<Data>();
}
data.Count에서 0이 나와 결과가 왜 저렇게 나오는지, 게다가 저게 하필 배열이라 뭔가 다른 방법이 있어야만 하는 것인지 자칫 (저처럼) 헤맬 수가 있습니다. 사실 저게 몇 개 안 되는 필드/멤버를 가진 경우에는 금방 표가 나서 쉽게 구분이 되지만 필드가 많아지면 쉽게 식별하지 못할 수 있습니다.
따라서, 처음 예제처럼 get/set 접근자를 사용하든가, 아니면
JsonInclude 특성을 포함하면 문제가 해결됩니다.
public class DataList
{
public string id { get; set; } = "";
[JsonInclude]
public List<Data> data = new List<Data>();
}
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]