Ранее мы уже рассматривали работу с JSON в C# применительно к .NET Framework. Однако время не стоит на месте и на смену .NET Framework пришла .NET Core, которая окончательно вытеснила его в .NET 5. Но, в случае .NET Core старые проверенные приёмы работают не всегда. Как работать с JSON в .NET Core?
На самом деле существует три способа.
DataContractJsonSerializer
Первый из них – класс DataContractJsonSerializer. Этот класс перешёл в .NET Core из .NET Framework и работа с ним была уже достаточно подробно описана ранее. Поэтому не станем повторяться.
Сторонние библиотеки
Второй вариант – это использование сторонних библиотек. Например, Newtonsoft.Json.
Возьмём тот же класс, что и в предыдущей статье.
1 2 3 4 5 6 |
class Company { public string Name { get; set; } public string INN { get; set; } public string Adress { get; set; } } |
Создадим его экземпляр:
1 |
Company company = new Company() { Adress = "г.Москва", INN = "000000000000", Name = "ООО Ромашка" }; |
Далее при помощи метода SerializeObject класса JsonConvert мы можем получить данный объект в виде JSON строки.
1 |
string jsonString = JsonConvert.SerializeObject(company); |
Переменная jsonString в данном случае будет содержать следующее значение.
1 |
{"Name":"ООО Ромашка","INN":"000000000000","Adress":"г.Москва"} |
Также имеется возможность получить (десериализовать) JSON строку в исходный объект при помощи обобщённого метода DeserializeObject.
1 |
Company restoredCompany = JsonConvert.DeserializeObject(jsonString); |
Это далеко не весь функционал, который может предложить данная библиотека, но для большинства операций вполне достаточно и этого.
JsonSerializer
Класс JsonSerializer появился в .NET Core 3 (пространство имён System.Text.Json). Реализация сериализации и десериализации JSON с его помощью по лёгкости вполне сопоставима с Newtonsoft.Json.
Перепишем предыдущие примеры с использованием JsonSerializer.
Сериализация:
1 |
string jsonString = JsonSerializer.Serialize(company); |
Десериализация:
1 |
Company restoredCompany = JsonSerializer.Deserialize(jsonString); |
Однако в отличие от Newtonsoft.Json JsonSerializer не только требует указания типа при сериализации, но и по умолчанию экранирует строки.
1 |
{"Name":"\u041E\u041E\u041E \u0420\u043E\u043C\u0430\u0448\u043A\u0430","INN":"000000000000","Adress":"\u0433.\u041C\u043E\u0441\u043A\u0432\u0430"} |
Чтобы отключить экранирование необходимо создать объект JsonSerializerOptions с соответствующими настройками и передать его в качестве параметра в метод Serialize.
1 2 3 4 5 |
JsonSerializerOptions options = new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; string jsonString = JsonSerializer.Serialize(company, options); |
В случае десериализации экранирование строк уже не критично. Во всяком случае, если используется Encoder по умолчанию. Однако других значений кроме как Default и UnsafeRelaxedJsonEscaping, который, собственно, и отключает экранирование даже в .NET 5 не предусмотрено.
Интересная особенность класса JsonSerializerOptions – возможность автоматически форматировать JSON строку при сериализации. За это отвечает свойство WriteIndented. Если оно имеет значение true (по умолчанию false) то вместо стандартного отображения в одну строку JSON будет выведен на экран в гораздо более читабельном виде.
Пример:
1 2 3 4 5 6 |
JsonSerializerOptions options = new JsonSerializerOptions { // Отключаем экранирование и одновременно включаем форматирование. Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping WriteIndented = true }; |
Вывод на экран консоли (как пример).
1 2 3 4 5 |
{ "Name": "ООО Ромашка", "INN": "000000000000", "Adress": "г.Москва" } |
Добавить комментарий