Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Библиотека 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.
Тип разрушающего изменения
Причина изменения
Изменение повышает правильность и надежность, гарантируя правильность имен свойств метаданных, предотвращая обход проверки свойств метаданных. Дополнительные сведения см. в проблеме, о которой сообщено.
Рекомендуемое действие
Избегайте использования обхода для обхода проверки свойств метаданных. Вместо этого выберите имена свойств, которые не конфликтуют со свойствами метаданных.