День 1109. #ЧтоНовенького
Новинки System.Text.Json в .NET 6. Окончание
Начало
5. Поддержка IAsyncEnumerable
Сериализация IAsyncEnumerable преобразует его в массив.
static async IAsyncEnumerable<int> GetAsync(int n)
{
for (int i = 0; i < n; i++)
{
await Task.Delay(1000);
yield return i;
}
}
JsonSerializerOptions options = new() {
WriteIndented = true
};
using Stream output =
Console.OpenStandardOutput();
var data = new { Data = GetAsync(5) };
await JsonSerializer.SerializeAsync(
output, data, options);
Для десериализации JSON-массивов корневого уровня добавлен метод DeserializeAsyncEnumerable:
// оборачивает текст в IAsyncEnumerable<T>
using MemoryStream stream =
new(Encoding.UTF8.GetBytes("[0,1,2,3,4]"));
await foreach (int item in
JsonSerializer.DeserializeAsyncEnumerable<int>(stream))
{
Console.WriteLine(item);
}
6. Работа с JSON как с DOM
.NET 6 предоставляет типы для произвольного доступа к элементам JSON в структурированном представлении данных. Новые типы из пространства имён System.Text.Json.Nodes:
- JsonArray
- JsonNode
- JsonObject
- JsonValue
// Парсим объект JSON
var node = JsonNode.Parse(
"{\"Value\":\"Text\",\"Array\":[1,5,13,17,2]}"
);
string value = (string)node["Value"];
// либо
value = node["Value"].GetValue<string>();
Console.WriteLine(value); // Text
int item = node["Array"][1].GetValue<int>();
// либо
item = (int)node["Array"][1];
Console.WriteLine(arrayItem); // 5
// Создаём JsonObject
var obj = new JsonObject
{
["Value"] = "Text",
["Array"] = new JsonArray(1, 5, 13, 17, 2)
};
Console.WriteLine(obj["Value"]); // Text
Console.WriteLine(obj["Array"][1]); // 5
// преобразуем в строку
string json = obj.ToJsonString();
Console.WriteLine(json);
// {"Value":"Text","Array":[1,5,13,17,2]}
Источник: blog.okyrylchuk.dev/system-…dotnet-6