using Newtonsoft.Json;
using System.ComponentModel;
struct JsonObject
{
// Null값을 세팅하여 직렬화 시 무시되는지 체크
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public int? IgnoreNullInt { get; set; }
// Null값을 세팅하여 직렬화 시 무시가 되지 않는지 체크
[JsonProperty(NullValueHandling = NullValueHandling.Include)]
public int? IncludeNullInt { get; set; }
// Null이 아닌 값을 세팅하여 무시되지 않는지 체크
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public int? NotNullInt { get; set; }
// int형에 default를 할당하면 0이 할당되는데, DefaultValue로 0을 지정하여 무시되는지 체크
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[DefaultValue(0)]
public int IgnoreDefaultValue { get; set; }
// int형에 default를 할당하면 0이 할당되는데, DefaultValue로 0을 지정하여 무시되지 않는지 체크
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)]
[DefaultValue(0)]
public int IncludeDefaultValue { get; set; }
// DefaultValue를 30으로 설정하여, 30을 할당한 후 무시되는지 체크
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[DefaultValue(30)]
public int IgnoreChangeDefaultValue { get; set; }
// DefaultValue를 30으로 설정하여, 30이외의 값을 할당한 후 무시되는지 체크
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[DefaultValue(30)]
public int IgnoreChangeDefaultValue2 { get; set; }
// DefaultValue를 30으로 설정하여, int형의 default 값을 할당한 후 무시되는지 체크
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[DefaultValue(30)]
public int IgnoreChangeDefaultValue3 { get; set; }
// DefaultValue를 30으로 설정하여, 아무것도 할당하지 않고 DeserializeObject시 DefauleValue가 적용되는지 체크
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
[DefaultValue(30)]
public int IgnoreChangeDefaultValue4 { get; set; }
}
JsonObject test = new()
{
IgnoreNullInt = null, // 무시됨.
IncludeNullInt = null, // 무시 안 됨.
NotNullInt = 30, // 무시 안 됨.
IgnoreDefaultValue = 0, // 무시됨.
IncludeDefaultValue = 0, // 무시 안 됨.
IgnoreChangeDefaultValue = 30, // 무시됨.
IgnoreChangeDefaultValue2 = 40, // 무시 안 됨.
IgnoreChangeDefaultValue3 = default, // 무시 안 됨.
};
string serializeString = JsonConvert.SerializeObject(test, Formatting.Indented);
Console.WriteLine(serializeString);
string testString = @"{
""IncludeNullInt"": null,
""NotNullInt"": 30,
""IncludeDefaultValue"": 0,
""IgnoreChangeDefaultValue2"": 40,
""IgnoreChangeDefaultValue3"": 0,
}";
JsonObject obj = JsonConvert.DeserializeObject<JsonObject>(testString);
Console.WriteLine(obj.IgnoreChangeDefaultValue4); // Populate 속성으로 지정되었다면, DefaultValue 에 설정된 값으로 기본값이 적용된다.
Json.NET은 많이 사용되는 .NET Json 라이브러리인데요. 속성에 값을 주지 않을 경우 직렬화 시 무시하고 싶거나, 기본값을 변경하여 조건부로 무시하고 싶을 경우는 어떻게 하는지 알아봤습니다.
DefaultValueHandling.Populate 테스트를 추가했습니다.