Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

JamesBondCar savedCar = ReadAsXmlFormat<JamesBondCar>("CarData.xml");

Console.WriteLine("Original Car: {0}",savedCar.ToString);

Console.WriteLine("Read Car: {0}",savedCar.ToString);

List<JamesBondCar> savedCars =

ReadAsXmlFormat<List<JamesBondCar>>("CarCollection.xml");

Сериализация и десериализация с помощью System.Text.Json

В пространстве имен

System.Text.Json
имеется
класс
System.Text.Json.JsonSerializer
, который вы можете использовать для сохранения открытого состояния заданного объекта как данных JSON.

Управление генерацией данных JSON

По умолчанию

JsonSerializer
сериализирует все открытые свойства в виде пар "имя-значение" в формате JSON, применяя такие же имена (и регистр символов), как у имен свойств объекта. Вы можете управлять многими аспектами процесса сериализации с помощью наиболее часто используемых атрибутов, перечисленных в табл. 20.13.

Сериализация объектов с использованием JsonSerializer

Класс

JsonSerializer
содержит статические методы
Serialize
, применяемые для преобразования объектов .NET Core (включая графы объектов) в строковое представление открытых свойств. Данные представляются как пары "имя-значение" в формате JSON. Добавьте в файл
Program.cs
показанную ниже локальную функцию:

static void SaveAsJsonFormat<T>(T objGraph, string fileName)

{

File.WriteAllText(fileName,

System.Text.Json.JsonSerializer.Serialize(objGraph));

}

Добавьте к своим операторам верхнего уровня следующий код:

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
) будут включаться все открытые поля в графе объектов. Чтобы исключить отдельные открытые поля с использованием такого приема, вам придется использовать для этих полей атрибут
JsonExclude
.

Модифицируйте метод

SaveAsJsonFormat
, как показано ниже:

static void SaveAsJsonFormat<T>(T objGraph, string fileName)

{

var options = new JsonSerializerOptions

{

IncludeFields = true,

};

File.WriteAllText(fileName,

System.Text.Json.JsonSerializer.Serialize(objGraph, options));

}

Вместо

применения класса
JsonSerializerOptions
того же результата можно достичь, обновив все открытые поля в примерах классов следующим образом (имейте в виду, что вы можете оставить в классах атрибуты
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.

Поделиться с друзьями: