Введение в работу с JSON в C#
JSON (JavaScript Object Notation) — это легковесный формат обмена данными, который стал стандартом для взаимодействия между веб-сервисами, конфигурационными файлами и API. В экосистеме C# (.NET) работа с JSON является одной из базовых задач, с которой сталкивается каждый разработчик. В этой статье мы подробно разберём, как выполнять парсинг (десериализацию) и сериализацию данных в C#, используя как встроенную библиотеку System.Text.Json, так и популярную стороннюю библиотеку Newtonsoft.Json.
Вы узнаете, как преобразовывать объекты C# в JSON-строки и обратно, как работать с вложенными структурами, а также какие подводные камни могут встретиться на практике. Материал будет полезен как новичкам, так и опытным разработчикам, желающим систематизировать знания.
Сериализация объектов C# в JSON
Сериализация — это процесс преобразования объекта C# (или другой структуры данных) в строку формата JSON. В .NET для этого существует несколько подходов. Рассмотрим два основных: System.Text.Json (рекомендуемый Microsoft) и Newtonsoft.Json (легаси, но всё ещё широко используемый).
Сериализация с помощью System.Text.Json
Начиная с .NET Core 3.0, Microsoft представила собственную библиотеку для работы с JSON — System.Text.Json. Она отличается высокой производительностью и минимальным потреблением памяти. Для сериализации используется метод JsonSerializer.Serialize().
using System;
using System.Text.Json;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
class Program
{
static void Main()
{
var person = new Person
{
Name = "Иван Петров",
Age = 30,
Email = "ivan@example.com"
};
string json = JsonSerializer.Serialize(person);
Console.WriteLine(json);
}
}
Результат выполнения:
{"Name":"Иван Петров","Age":30,"Email":"ivan@example.com"}
Сериализация с помощью Newtonsoft.Json
Библиотека Newtonsoft.Json (также известная как Json.NET) долгое время была стандартом де-факто. Она предоставляет больше гибкости и настроек, чем встроенное решение. Для её использования необходимо установить NuGet-пакет Newtonsoft.Json.
using System;
using Newtonsoft.Json;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
class Program
{
static void Main()
{
var person = new Person
{
Name = "Мария Сидорова",
Age = 25,
Email = "maria@example.com"
};
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json);
}
}
Результат будет аналогичным, но Newtonsoft.Json по умолчанию использует верблюжью нотацию (camelCase) для имён свойств, если это настроено.
Настройка сериализации
В обеих библиотеках можно управлять форматом вывода: игнорировать null-значения, использовать CamelCase, форматировать JSON с отступами и т.д.
Пример для System.Text.Json с настройками:
var options = new JsonSerializerOptions
{
WriteIndented = true, // Красивый вывод с отступами
PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // Верблюжья нотация
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull // Игнорировать null
};
string json = JsonSerializer.Serialize(person, options);
Парсинг (десериализация) JSON в C#
Десериализация — это обратный процесс: преобразование JSON-строки в объект C#. Это необходимо при получении данных из API, чтении конфигурационных файлов или обработке веб-запросов.
Десериализация с помощью System.Text.Json
Метод JsonSerializer.Deserialize<T>() позволяет преобразовать строку в объект указанного типа.
string jsonString = @"{""Name"":""Алексей"",""Age"":35,""Email"":""alex@example.com""}";
Person person = JsonSerializer.Deserialize<Person>(jsonString);
Console.WriteLine($"Имя: {person.Name}, Возраст: {person.Age}");
Десериализация с помощью Newtonsoft.Json
string jsonString = @"{""Name"":""Ольга"",""Age"":28,""Email"":""olga@example.com""}";
Person person = JsonConvert.DeserializeObject<Person>(jsonString);
Console.WriteLine($"Имя: {person.Name}, Email: {person.Email}");
Работа с динамическими и анонимными типами
Иногда структура JSON заранее не известна. В таких случаях можно использовать JsonDocument (System.Text.Json) или JObject (Newtonsoft.Json) для доступа к данным без создания строго типизированного класса.
Пример с JsonDocument:
string jsonString = @"{""product"":""Ноутбук"",""price"":75000}";
using JsonDocument doc = JsonDocument.Parse(jsonString);
JsonElement root = doc.RootElement;
string product = root.GetProperty("product").GetString();
int price = root.GetProperty("price").GetInt32();
Console.WriteLine($"{product}: {price} руб.");
Обработка сложных структур данных
На практике JSON редко бывает плоским. Часто встречаются вложенные объекты, массивы и списки. Рассмотрим, как с этим работать.
Работа с массивами и списками
Допустим, у нас есть JSON с массивом пользователей:
[
{"Name": "Иван", "Age": 30},
{"Name": "Мария", "Age": 25}
]
Для десериализации такого массива используется List<T> или массив:
string jsonArray = "[{\"Name\":\"Иван\",\"Age\":30},{\"Name\":\"Мария\",\"Age\":25}]";
List<Person> people = JsonSerializer.Deserialize<List<Person>>(jsonArray);
foreach (var p in people)
{
Console.WriteLine($"{p.Name}, {p.Age} лет");
}
Вложенные объекты
Предположим, у нас есть JSON с информацией о компании и её сотрудниках:
{
"companyName": "TechCorp",
"employees": [
{"Name": "Анна", "Position": "Developer"},
{"Name": "Борис", "Position": "Manager"}
]
}