Язык программирования C#9 и платформа .NET5
"hasTweeters": true,"hasSubWoofers": false,"stationPresets": [89.3,105.1,97.1],"radioId": "XF-552RR6"},"isHatchBack": false}При чтении данных JSON в коде C# по умолчанию поддерживается чувствительность к регистру символов. Политика именования соответствует настройке
, применяемой во время десериализации. Если ничего не установлено, тогда используется стандартный стиль Pascal. УстановкаPropertyNamingPolicyвPropertyNamingPolicyсвидетельствует об ожидании того, что все входящие данные JSON должны быть представлены в "верблюжьем" стиле. Если политики именования не совпадают, то процесс десериализации (рассматриваемый далее) потерпит неудачу.CamelCaseПри десериализации JSON существует третий вариант — нейтральность к политике именования. Установка параметра
вPropertyNameCaseInsensitiveприводит к тому, чтоtrueиcanSubmergeбудут десериализироваться. Вот код установки этого параметра:CanSubmergeJsonSerializerOptions options = new(){PropertyNameCaseInsensitive = true,IncludeFields = true};Обработка чисел с помощью JsonSerializer
Стандартным режимом обработки чисел является
, который предусматривает, что числа будут сериализироваться как числа (без кавычек) и сериализироваться как числа (без кавычек). В классеStrictимеется свойствоJsonSerializerOptions, которое управляет чтением и записью чисел. В табл. 20.14 перечислены значения, доступные в перечисленииNumberHandling.JsonNumberHandlingПеречисление
имеет атрибутJsonNumberHandling, который делает возможным побитовое сочетание его значений. Например, если вы хотите читать строки (и числа) и записывать числа в виде строк, тогда применяйте следующую настройку:flagsJsonSerializerOptions 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
В случае применения класса
лучше всего создать единственный экземпляр и многократно использовать его повсюду в приложении. С учетом сказанного модифицируйте операторы верхнего уровня и методы, относящиеся к JSON, как показано ниже:JsonSerializerOptionJsonSerializerOptions 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,
