День 1108. #ЧтоНовенького
Новинки System.Text.Json в .NET 6. Начало
1. Игнорирование циклических ссылок
В .NET 5 при обнаружении циклических ссылок выдавалось исключение JsonException. В .NET 6 их можно игнорировать:
JsonSerializerOptions options = new()
{
ReferenceHandler = ReferenceHandler.IgnoreCycles
};
string json = JsonSerializer.Serialize(myObj, options);
2. Уведомления при сериализации/десериализации
Появилось 4 новых интерфейса, которые можно реализовать в соответствии с вашими потребностями:
- IJsonOnDeserialized
- IJsonOnDeserializing
- IJsonOnSerialized
- IJsonOnSerializing
class Product : IJsonOnDeserialized, IJsonOnSerializing
{
public string Name { get; set; }
public string Test { get; set; }
void IJsonOnDeserialized.OnDeserialized()
=> Validate();
void IJsonOnSerializing.OnSerializing()
=> Validate();
private void Validate()
{
if (Name is null)
throw new InvalidOperationException(
"Name can't be null."
);
}
}
3. Порядок сериализации свойств
Атрибут JsonPropertyOrder позволяет контролировать порядок сериализации свойств:
class Product
{
// после Price
[JsonPropertyOrder(2)]
public string Category { get; set; }
// после свойств с порядком по умолчанию
[JsonPropertyOrder(1)]
public decimal Price { get; set; }
// порядок по умолчанию - 0
public string Name { get; set; }
// перед свойствами с порядком по умолчанию
[JsonPropertyOrder(-1)]
public int Id { get; set; }
}
Вывод:
{
"Id": 1,
"Name": "Surface Pro 7",
"Price": 550,
"Category": "Laptops"
}
4. Сериализация из/в поток
В .NET 6 добавлены перегрузки синхронных методов Serialize/Deserialize для потоков:
// десериализация из потока
using MemoryStream ms = new MemoryStream(bytes);
MyClass ex =
JsonSerializer.Deserialize<MyClass>(ms);
// сериализация в поток
JsonSerializerOptions options = new() {
WriteIndented = true
};
using Stream output = Console.OpenStandardOutput();
MyClass ex = new() { Value = "Test" };
JsonSerializer.Serialize<MyClass>(output, ex, options);
Окончание следует…
Источник: blog.okyrylchuk.dev/system-…dotnet-6