라이브러리가 System.Text.Json 메타데이터 속성 이름을 비이스케이프하도록 수정되었습니다. 이 변경 내용은 참조 보존, 다형성 및 메타데이터 속성 유효성 검사의 컨텍스트에서 JSON 문서를 해석하는 방법에 영향을 줍니다.
도입된 버전
.NET 9
이전 동작
System.Text.Json 이전에는 메타데이터 속성 이름을 비스케이프하지 않았습니다. 이로 인해 잘못된 속성 이름이 수락되어 메타데이터 속성 유효성 검사를 무시할 수 있습니다.
예를 들어 다음 코드는 첫 번째 호출에서 성공하지만 두 번째 호출에서 예외를 throw합니다.
JsonSerializerOptions options = new() { ReferenceHandler = ReferenceHandler.Preserve };
JsonSerializer.Deserialize<MyPoco>("""{"\u0024invalid" : 42 }""", options);
JsonSerializer.Deserialize<MyPoco>("""{"$invalid" : 42 }""", options);
record MyPoco;
이스케이프 해제 동작은 다음과 같이 이름이 이스케이프가 필요한 메타데이터 속성을 반올림할 때 다형성 문제를 일으킬 수도 있습니다.
string json = JsonSerializer.Serialize<Base>(new Derived());
Console.WriteLine(json); // {"categor\u00EDa":"derived"}
Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); // False
[JsonPolymorphic(TypeDiscriminatorPropertyName = "categoría")]
[JsonDerivedType(typeof(Derived), "derived")]
public record Base;
public record Derived : Base;
새 동작
System.Text.Json 이제 메타데이터 속성 이름의 이스케이프를 해제합니다. 이 새로운 동작은 다형 역직렬화 예제의 줄 Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); 이 이제 반환 true되고 잘못된 속성 이름이 다음 예외로 올바르게 역직렬화되지 않음을 의미합니다.
Unhandled exception. System.Text.Json.JsonException: Properties that start with '$' are not allowed in types that support metadata.
파괴적 변경 유형
이 변경 사항은 행동 변화입니다.
변경 이유
이 변경은 메타데이터 속성 이름이 제대로 이스케이프되지 않도록 하여 메타데이터 속성 유효성 검사를 우회하지 않도록 하여 정확성과 안정성을 향상시킵니다. 자세한 내용은 보고된 문제를 참조하세요.
권장 작업
메타데이터 속성 유효성 검사를 우회하기 위해 이스케이프를 사용하지 마세요. 대신 메타데이터 속성과 충돌하지 않는 속성 이름을 선택합니다.
영향을 받는 API
.NET