필수 속성
역직렬화가 성공하려면 JSON 페이로드에 있어야 함을 나타내기 위해 특정 속성을 표시할 수 있습니다. 마찬가지로 선택 사항이 아닌 모든 생성자 매개 변수가 JSON 페이로드에 있음을 지정하는 옵션을 설정할 수 있습니다. 이러한 필수 속성 중 하나 이상이 없는 경우 JsonSerializer.Deserialize 메서드는 JsonException을 throw합니다.
JSON deserialization에 필요한 속성 또는 필드를 표시하는 방법에는 다음 세 가지가 있습니다.
- 한정자를
required
추가합니다. - 에 주석을 추가합니다 JsonRequiredAttribute.
- 계약 모델의 속성을 수정합니다 JsonPropertyInfo.IsRequired .
JSON 역직렬화에 선택적이 아닌 생성자 매개 변수가 모두 필요하도록 지정하려면 옵션(또는 원본 생성의 RespectRequiredConstructorParameters 경우 속성)을 으로 true
설정합니다JsonSerializerOptions.RespectRequiredConstructorParameters. 자세한 내용은 선택 사항이 아닌 생성자 매개 변수 섹션을 참조하세요.
직렬 변환기의 관점에서 C# required
한정자와 [JsonRequired]
특성은 동일하며, 둘 다 동일한 메타데이터 조각(예: )에 매핑됩니다 JsonPropertyInfo.IsRequired. 대부분의 경우 기본 제공 C# 키워드만 사용합니다. 그러나 다음 경우에는 JsonRequiredAttribute를 대신 사용해야 합니다.
- C# 이외의 프로그래밍 언어 또는 C#의 하위 수준 버전을 사용하는 경우
- JSON deserialization에만 적용하려는 경우
- 원본 생성 모드에서
System.Text.Json
serialization을 사용하는 경우 여기서는 소스 생성이 컴파일 시간에 발생하므로required
한정자를 사용하는 경우 코드가 컴파일되지 않습니다.
다음 코드 조각은 required
키워드로 수정된 속성의 예를 보여 줍니다. deserialization이 성공하려면 이 속성이 JSON 페이로드에 있어야 합니다.
public static void RunIt()
{
// The following line throws a JsonException at run time.
Console.WriteLine(JsonSerializer.Deserialize<Person>("""{"Age": 42}"""));
}
public class Person
{
public required string Name { get; set; }
public int Age { get; set; }
}
또는 JsonRequiredAttribute를 사용할 수 있습니다.
public static void RunIt()
{
// The following line throws a JsonException at run time.
Console.WriteLine(JsonSerializer.Deserialize<Person>("""{"Age": 42}"""));
}
public class Person
{
[JsonRequired]
public string Name { get; set; }
public int Age { get; set; }
}
또한 JsonPropertyInfo.IsRequired 속성을 사용하여 계약 모델을 통해 속성이 필요한지 여부를 제어할 수도 있습니다.
public static void RunIt()
{
var options = new JsonSerializerOptions
{
TypeInfoResolver = new DefaultJsonTypeInfoResolver
{
Modifiers =
{
static typeInfo =>
{
if (typeInfo.Kind != JsonTypeInfoKind.Object)
return;
foreach (JsonPropertyInfo propertyInfo in typeInfo.Properties)
{
// Strip IsRequired constraint from every property.
propertyInfo.IsRequired = false;
}
}
}
}
};
// Deserialization succeeds even though
// the Name property isn't in the JSON payload.
JsonSerializer.Deserialize<Person>("""{"Age": 42}""", options);
}
public class Person
{
public required string Name { get; set; }
public int Age { get; set; }
}
선택 사항이 아닌 생성자 매개 변수
.NET 9 이전의 생성자 기반 역직렬화는 다음 예제와 같이 모든 생성자 매개 변수를 선택 사항으로 처리했습니다.
var result = JsonSerializer.Deserialize<Person>("{}");
Console.WriteLine(result); // Person { Name = , Age = 0 }
record Person(string Name, int Age);
.NET 9부터 필요에 따라 선택적이 아닌 생성자 매개 변수를 처리하도록 플래그를 설정할 RespectRequiredConstructorParameters 수 있습니다.
public static void RunIt()
{
JsonSerializerOptions options = new()
{
RespectRequiredConstructorParameters = true
};
string json = """{"Age": 42}""";
// The following line throws a JsonException at run time.
JsonSerializer.Deserialize<Person>(json, options);
}
record Person(string Name, int? Age = null);
기능 전환
기능 스위치를 RespectRequiredConstructorParameters
사용하여 System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault
전역적으로 설정을 켤 수 있습니다. 프로젝트 파일(예 : .csproj 파일)에 다음 MSBuild 항목을 추가합니다.
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault" Value="true" />
</ItemGroup>
API는 RespectRequiredConstructorParametersDefault
기존 애플리케이션을 중단하지 않도록 .NET 9에서 옵트인 플래그로 구현되었습니다. 새 애플리케이션을 작성하는 경우 코드에서 이 플래그를 사용하도록 설정하는 것이 좋습니다.
참고 항목
.NET