Сериализация и десериализация с помощью System.Text.Json
В пространстве имен
System.Text.Json
имеется
класс
System.Text.Json.JsonSerializer
, который вы можете использовать для сохранения открытого состояния заданного объекта как данных JSON.
Управление генерацией данных JSON
По умолчанию
JsonSerializer
сериализирует все открытые свойства в виде пар "имя-значение" в формате JSON, применяя такие же имена (и регистр символов), как у имен свойств объекта. Вы можете управлять многими аспектами процесса сериализации с помощью наиболее часто используемых атрибутов, перечисленных в табл. 20.13.
Сериализация объектов с использованием JsonSerializer
Класс
JsonSerializer
содержит статические методы
Serialize
, применяемые для преобразования объектов .NET Core (включая графы объектов) в строковое представление открытых свойств. Данные представляются как пары "имя-значение" в формате JSON. Добавьте в файл
Добавьте к своим операторам верхнего уровня следующий код:
SaveAsJsonFormat(jbc, "CarData.json");
Console.WriteLine("=> Saved car in JSON format!");
SaveAsJsonFormat(p, "PersonData.json");
Console.WriteLine("=> Saved person in JSON format!");
Когда вы будете исследовать файлы JSON, вас может удивить тот факт, что файл
CarData.json
пуст (не считая пары фигурных скобок), а файл
PersonData.json
содержит только значение
Firstname
. Причина в том, что
JsonSerializer
по умолчанию записывает только открытые свойства, но не открытые поля. Проблема решается в следующем разделе.
Включение полей
Включить открытые поля в генерируемые данные JSON можно двумя способами. Первый способ предусматривает использование класса
JsonSerializerOptions
для сообщения
JsonSerialize
r о необходимости включить все поля. Второй способ предполагает модификацию классов за счет добавления атрибута
[Jsonlnclude]
к каждому открытому полю, которое должно быть включено в вывод JSON. Обратите внимание, что при первом способе (применение
JsonSerializationOptions
) будут включаться все открытые поля в графе объектов. Чтобы исключить отдельные открытые поля с использованием такого приема, вам придется использовать для этих полей атрибут
того же результата можно достичь, обновив все открытые поля в примерах классов следующим образом (имейте в виду, что вы можете оставить в классах атрибуты
Xml
и они не будут помехой
JsonSerializer
):
// Radio.cs
public class Radio
{
[JsonInclude]
public bool HasTweeters;
[JsonInclude]
public bool HasSubWoofers;
[JsonInclude]
public List<double> StationPresets;
[JsonInclude]
public string RadioId = "XF-552RR6";
...
}
// Car.cs
public class Car
{
[JsonInclude]
public Radio TheRadio = new Radio;
[JsonInclude]
public bool IsHatchBack;
...
}
// JamesBondCar.cs
public class JamesBondCar : Car
{
[XmlAttribute]
[JsonInclude]
public bool CanFly;
[XmlAttribute]
[JsonInclude]
public bool CanSubmerge;
...
}
// Person.cs
public class Person
{
// Открытое поле.
[JsonInclude]
public bool IsAlive = true;
...
}
Теперь в результате запуска кода любым способом все открытые свойства и поля записываются в файл. Однако, заглянув содержимое файла, вы увидите, что данные JSON были записаны в минифицированном виде, т.е. в формате, в котором все незначащие пробельные символы и разрывы строк удаляются. Формат является стандартным во многом из-за широкого использования JSON для служб REST и уменьшения размера пакета данных при передаче информации между службами по HTTP/HTTPS.