Работа с JSON в C#: парсинг и сериализация для .NET

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в работу с 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"}
  ]
}

                
                

Блоги

Рекомендаций по книгам