Работа с JSON в C#: парсинг и сериализация для начинающих

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

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

Начать курс

Введение в работу с JSON в C#

JSON (JavaScript Object Notation) — это легковесный формат обмена данными, который широко используется в веб-разработке, конфигурационных файлах и API. Если вы начинаете изучать C# и .NET, умение работать с JSON — обязательный навык. В этой статье мы разберем, как выполнять парсинг JSON (преобразование строки в объект) и сериализацию (преобразование объекта в строку JSON) с помощью встроенных средств .NET и популярной библиотеки Newtonsoft.Json.

Мы рассмотрим практические примеры, которые помогут вам быстро освоить ключевые концепции. Весь код написан на C# (.NET 6+), но будет работать и в более ранних версиях с минимальными изменениями.

1. Встроенная работа с JSON: пространство имен System.Text.Json

Начиная с .NET Core 3.0, Microsoft представила высокопроизводительное пространство имен System.Text.Json. Оно встроено в платформу и не требует установки дополнительных пакетов. Это основной инструмент для работы с JSON в современных приложениях .NET.

1.1 Сериализация объекта в JSON

Сериализация — это процесс преобразования объекта C# в строку JSON. Рассмотрим простой класс Person:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
}

// Использование
var person = new Person
{
    Name = "Иван Иванов",
    Age = 30,
    Email = "ivan@example.com"
};

string json = System.Text.Json.JsonSerializer.Serialize(person);
Console.WriteLine(json);

Результат выполнения:

{"Name":"Иван Иванов","Age":30,"Email":"ivan@example.com"}

По умолчанию свойства сериализуются с именами, совпадающими с именами свойств в C#. Вы можете настроить форматирование с помощью JsonSerializerOptions, например, сделать JSON более читаемым:

var options = new System.Text.Json.JsonSerializerOptions
{
    WriteIndented = true
};

string prettyJson = JsonSerializer.Serialize(person, options);
Console.WriteLine(prettyJson);

Теперь вывод будет с отступами:

{
  "Name": "Иван Иванов",
  "Age": 30,
  "Email": "ivan@example.com"
}

1.2 Десериализация (парсинг) JSON в объект

Обратный процесс — преобразование строки JSON в объект C# — называется десериализацией. Используйте метод JsonSerializer.Deserialize<T>():

string jsonString = @"{""Name"":""Мария Петрова"",""Age"":25,""Email"":""maria@example.com""}";

Person? person = System.Text.Json.JsonSerializer.Deserialize<Person>(jsonString);

if (person != null)
{
    Console.WriteLine($"Имя: {person.Name}, Возраст: {person.Age}");
}

Важно: если JSON не соответствует структуре класса, будет выброшено исключение JsonException. Для безопасной работы используйте обработку исключений или проверяйте на null.

1.3 Работа с JsonDocument для произвольного JSON

Иногда структура JSON заранее неизвестна или вы хотите прочитать данные без создания классов. Для этого используйте JsonDocument:

string jsonText = @"{""product"":""Ноутбук"",""price"":75000,""inStock"":true}";

using JsonDocument doc = JsonDocument.Parse(jsonText);
JsonElement root = doc.RootElement;

string product = root.GetProperty("product").GetString();
int price = root.GetProperty("price").GetInt32();
bool inStock = root.GetProperty("inStock").GetBoolean();

Console.WriteLine($"{product}: {price} руб. (в наличии: {inStock})");

JsonDocument реализует IDisposable, поэтому обязательно используйте using для освобождения ресурсов.

2. Классическая библиотека Newtonsoft.Json (Json.NET)

До появления System.Text.Json стандартом де-факто была библиотека Newtonsoft.Json (также известная как Json.NET). Она до сих пор широко используется, особенно в legacy-проектах. Для установки выполните:

dotnet add package Newtonsoft.Json

2.1 Сериализация с Newtonsoft.Json

Синтаксис очень похож, но используются методы из класса JsonConvert:

using Newtonsoft.Json;

var person = new Person { Name = "Алексей", Age = 28, Email = "alex@mail.com" };
string json = JsonConvert.SerializeObject(person, Formatting.Indented);
Console.WriteLine(json);

2.2 Десериализация с Newtonsoft.Json

string json = @"{'Name':'Ольга','Age':32,'Email':'olga@mail.com'}";
Person? person = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine(person?.Name);

Обратите внимание: Newtonsoft.Json по умолчанию поддерживает как двойные кавычки, так и одинарные, что делает его более гибким при работе с нестандартным JSON.

2.3 Работа с JObject и JArray

Для динамической работы с JSON Newtonsoft.Json предоставляет классы JObject и JArray:

string json = @"{'city':'Москва','population':12600000}";
JObject obj = JObject.Parse(json);

string city = obj["city"].ToString();
int population = (int)obj["population"];

// Добавление нового поля
obj["country"] = "Россия";
Console.WriteLine(obj.ToString());

Это удобно, когда структура JSON меняется или вы не хотите создавать отдельный класс.

3. Продвинутые техники: атрибуты и кастомная сериализация

В реальных проектах часто требуется настроить поведение сериализации: изменить имена полей, игнорировать null-значения или обработать сложные типы данных.

3.1 Атрибуты в System.Text.Json

Используйте атрибут [JsonPropertyName], чтобы задать другое имя в JSON:

public class Product
{
    [JsonPropertyName("product_name")]
    public string Name { get; set; }

    [JsonPropertyName("unit_price")]
    public decimal Price { get; set; }

    [JsonIgnore] // Игнорировать при сериализации
    public string InternalCode { get; set; }
}

3.2 Атрибуты в Newtonsoft.Json

В Newtonsoft.Json используются атрибуты [JsonProperty] и <

Блоги

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