Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Библиотека System.Text.Json была обновлена, чтобы восстанавливать исходные имена свойств метаданных. Это изменение влияет на интерпретацию документов JSON в контексте сохранения ссылок, полиморфизма и проверки свойств метаданных.
Представленная версия
.NET 9
Предыдущее поведение
Ранее System.Text.Json не выполнял раскодировку имен свойств метаданных. Это приведет к принятию недопустимых имен свойств, которые могут обойти проверку свойств метаданных.
Например, следующий код завершится первым вызовом, но вызовет исключение во втором вызове:
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.
Тип разрушающего изменения
Причина изменения
Изменение повышает правильность и надежность, гарантируя правильность имен свойств метаданных, предотвращая обход проверки свойств метаданных. Дополнительные сведения см. в проблеме, о которой сообщено.
Рекомендуемое действие
Избегайте использования обхода для обхода проверки свойств метаданных. Вместо этого выберите имена свойств, которые не конфликтуют со свойствами метаданных.