"hasTweeters": true,
"hasSubWoofers": false,
"stationPresets": [
89.3,
105.1,
97.1
],
"radioId": "XF-552RR6"
},
"isHatchBack": false
}
При чтении данных JSON в коде C# по умолчанию поддерживается чувствительность к регистру символов. Политика именования соответствует настройке
PropertyNamingPolicy
, применяемой во время десериализации. Если ничего не установлено, тогда используется стандартный стиль Pascal. Установка
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": [
<b> "89.3",</b>
<b> "105.1",</b>
<b> "97.1"</b>
],
"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,