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