Стиль Pascal представляет собой формат, в котором первый символ и каждая важная часть имени начинается с символа в верхнем регистре. В предыдущем листинге данных JSON примером стиля Pascal служит CanSubmerge
canSubmerge.Почему это важно? Дело в том, что большинство популярных языков (в том числе С#) чувствительно к регистру. Таким образом, CanSubmerge
canSubmerge — два разных элемента. Повсюду в книге вы видели, что общепринятым стандартом для именования открытых конструкций в C# (классов, открытых свойств, функций и т.д.) является использование стиля Pascal. Тем не менее, в большинстве фреймворков JavaScript задействован "верблюжий" стиль. В итоге могут возникать проблемы при использовании .NET и C# для взаимодействия с другими системами, например, в случае передачи данных JSON туда и обратно между службами REST.К счастью, JsonSerializer
JsonSerializer при сериализации и десериализации JSON будет применять стиль Pascal. Чтобы заставить процесс сериализации использовать "верблюжий" стиль, модифицируйте параметры, как показано ниже:static void SaveAsJsonFormat
{
JsonSerializerOptions options = new()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
IncludeFields = true,
WriteIndented = true,
};
File.WriteAllText(fileName,
System.Text.Json.JsonSerializer.Serialize(objGraph, options));
}
Теперь выпускаемые данные JSON будут представлены в "верблюжьем" стиле:
{
"canFly": true,
"canSubmerge": false,
"theRadio": {
"hasTweeters": true,
"hasSubWoofers": false,
"stationPresets": [
89.3,
105.1,
97.1
],
"radioId": "XF-552RR6"
},
"isHatchBack": false
}
При чтении данных JSON в коде C# по умолчанию поддерживается чувствительность к регистру символов. Политика именования соответствует настройке PropertyNamingPolicy
PropertyNamingPolicy в CamelCase свидетельствует об ожидании того, что все входящие данные JSON должны быть представлены в "верблюжьем" стиле. Если политики именования не совпадают, то процесс десериализации (рассматриваемый далее) потерпит неудачу.При десериализации JSON существует третий вариант — нейтральность к политике именования. Установка параметра PropertyNameCaseInsensitive
true приводит к тому, что canSubmerge и CanSubmerge будут десериализироваться. Вот код установки этого параметра:JsonSerializerOptions options = new()
{
PropertyNameCaseInsensitive = true,
IncludeFields = true
};
Обработка чисел с помощью JsonSerializer
Стандартным режимом обработки чисел является Strict
JsonSerializerOptions имеется свойство NumberHandling, которое управляет чтением и записью чисел. В табл. 20.14 перечислены значения, доступные в перечислении JsonNumberHandling.Перечисление 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
}