다음을 통해 공유


필수 속성

역직렬화가 성공하려면 JSON 페이로드에 있어야 함을 나타내기 위해 특정 속성을 표시할 수 있습니다. 마찬가지로 선택 사항이 아닌 모든 생성자 매개 변수가 JSON 페이로드에 있음을 지정하는 옵션을 설정할 수 있습니다. 이러한 필수 속성 중 하나 이상이 없는 경우 JsonSerializer.Deserialize 메서드는 JsonException을 throw합니다.

JSON deserialization에 필요한 속성 또는 필드를 표시하는 방법에는 다음 세 가지가 있습니다.

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에서 옵트인 플래그로 구현되었습니다. 새 애플리케이션을 작성하는 경우 코드에서 이 플래그를 사용하도록 설정하는 것이 좋습니다.

참고 항목