Бөлісу құралы:


Средство чтения метаданных System.Text.Json теперь распаковывает названия свойств метаданных

Библиотека 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.

Тип разрушающего изменения

Это изменение поведения.

Причина изменения

Изменение повышает правильность и надежность, гарантируя правильность имен свойств метаданных, предотвращая обход проверки свойств метаданных. Дополнительные сведения см. в проблеме, о которой сообщено.

Избегайте использования обхода для обхода проверки свойств метаданных. Вместо этого выберите имена свойств, которые не конфликтуют со свойствами метаданных.

Затронутые API