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

ЖАНРЫ

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

Перечисление

JsonNumberHandling
имеет атрибут
flags
, который делает возможным побитовое сочетание его значений. Например, если вы хотите читать строки (и числа) и записывать числа в виде строк, тогда применяйте следующую настройку:

JsonSerializerOptions options = new

{

...

NumberHandling = JsonNumberHandling.AllowReadingFromString &

JsonNumberHandling.
WriteAsString

};

При

таком изменении данные JSON, созданные для класса
Car
, будут выглядеть так:

{

"canFly": true,

"canSubmerge": false,

"theRadio": {

"hasTweeters": true,

"hasSubWoofers": false,

"stationPresets": [

"89.3",

"105.1",

"97.1"

],

"radioId": "XF-552RR6"

},

"isHatchBack": false

}

Потенциальные проблемы, связанные с производительностью, при использовании JsonSerializerOption

В случае применения класса

JsonSerializerOption
лучше всего создать единственный экземпляр и многократно использовать его повсюду в приложении. С учетом сказанного модифицируйте операторы верхнего уровня и методы, относящиеся к JSON, как показано ниже:

JsonSerializerOptions options = new

{

PropertyNameCaseInsensitive = true,

PropertyNamingPolicy = JsonNamingPolicy.CamelCase,

IncludeFields = true,

WriteIndented = true,

NumberHandling =

JsonNumberHandling.AllowReadingFromString
|

JsonNumberHandling.
WriteAsString

};

SaveAsJsonFormat(options, jbc, "CarData.json");

Console.WriteLine("=> Saved car in JSON format!");

SaveAsJsonFormat(options, p, "PersonData.json");

Console.WriteLine("=> Saved person in JSON format!");

static void SaveAsJsonFormat<T>(JsonSerializerOptions options,

T objGraph, string fileName)

=> File.WriteAllText(fileName,

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

Стандартные настройки свойств JsonSerializer

для веб-приложений

При построении веб-приложений вы можете применять специализированный конструктор для установки следующих свойств:

PropertyNameCaseInsensitive = true,

PropertyNamingPolicy = JsonNamingPolicy.CamelCase,

NumberHandling = JsonNumberHandling.AllowReadingFromString

Вы по-прежнему можете устанавливать дополнительные свойства через инициализацию объектов, например:

JsonSerializerOptions options = new(JsonSerializerDefaults.Web)

{

WriteIndented = true

};

Сериализация коллекций объектов

Сериализация коллекций объектов в данные JSON выполняется аналогично сериализации одиночного объекта. Поместите приведенную далее локальную функцию в конец операторов верхнего уровня:

static void SaveListOfCarsAsJson(JsonSerializerOptions options, string fileName)

{

// Сохранить список List<T> объектов JamesBondCar.

List<JamesBondCar> myCars = new

{

new JamesBondCar { CanFly = true, CanSubmerge = true },

new JamesBondCar { CanFly = true, CanSubmerge = false },

new JamesBondCar { CanFly = false, CanSubmerge = true },

new JamesBondCar { CanFly = false, CanSubmerge = false },

};

File.WriteAllText(fileName,

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

Console.WriteLine("=> Saved list of cars!");

}

В заключение добавьте следующую строку, чтобы задействовать новую функцию:

SaveListOfCarsAsJson(options, "CarCollection.json");

Десериализация объектов и коллекций объектов

Как и десериализация XML, десериализация JSON является противоположностью сериализации. Показанная ниже функция будет десериализировать данные JSON в тип, заданный при вызове обобщенной версии метода:

static T ReadAsJsonFormat<T>(JsonSerializerOptions options,

string fileName) =>

System.Text.Json.JsonSerializer.Deserialize<T>

(File.ReadAllText(fileName), options);

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

JamesBondCar savedJsonCar =

ReadAsJsonFormat<JamesBondCar>(options, "CarData.json");

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

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