JSON обработка в C# (.NET): полное руководство
JSON (JavaScript Object Notation) — это лёгкий формат обмена данными, широко используемый в веб-приложениях, API и конфигурационных файлах. В экосистеме C# (.NET) существует два основных подхода к работе с JSON: классическая библиотека Newtonsoft.Json (также известная как Json.NET) и современная встроенная библиотека System.Text.Json, появившаяся в .NET Core 3.0 и выше. В этой статье мы подробно разберём оба инструмента, их возможности, синтаксис и лучшие практики.
1. Newtonsoft.Json (Json.NET)
Библиотека Newtonsoft.Json долгое время была стандартом де-факто для работы с JSON в C#. Она предоставляет богатый API, поддержку LINQ to JSON, гибкую настройку сериализации и десериализации. Установить её можно через NuGet:
Install-Package Newtonsoft.Json
1.1. Сериализация и десериализация
Самые базовые операции — преобразование объекта в JSON и обратно. Рассмотрим класс Person:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
Сериализация (объект → JSON):
var person = new Person { Name = "Иван", Age = 30, Email = "ivan@example.com" };
string json = JsonConvert.SerializeObject(person, Formatting.Indented);
Console.WriteLine(json);
Десериализация (JSON → объект):
string json = @"{""Name"":""Мария"",""Age"":25,""Email"":""maria@example.com""}";
Person person = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine(person.Name); // Мария
1.2. Работа с JObject и JArray
Библиотека Newtonsoft.Json поддерживает LINQ to JSON, что позволяет динамически обращаться к элементам JSON без создания строго типизированных классов.
string json = @"{""products"":[{""id"":1,""name"":""Ноутбук""},{""id"":2,""name"":""Мышь""}]}";
JObject obj = JObject.Parse(json);
JArray products = (JArray)obj["products"];
foreach (var product in products)
{
int id = (int)product["id"];
string name = (string)product["name"];
Console.WriteLine($"ID: {id}, Name: {name}");
}
1.3. Атрибуты для настройки сериализации
С помощью атрибутов можно управлять именами свойств в JSON, игнорировать поля, задавать значения по умолчанию и многое другое.
public class User
{
[JsonProperty("user_name")]
public string Name { get; set; }
[JsonIgnore]
public string Password { get; set; }
[JsonProperty("registration_date")]
public DateTime CreatedAt { get; set; }
}
// При сериализации Password будет пропущен, а Name станет "user_name"
string json = JsonConvert.SerializeObject(user);
2. System.Text.Json (встроенная библиотека .NET)
Начиная с .NET Core 3.0, Microsoft представила собственную библиотеку System.Text.Json, оптимизированную для производительности и минимального потребления памяти. Она не требует установки дополнительных пакетов (кроме некоторых расширений).
2.1. Сериализация и десериализация
Работа с System.Text.Json аналогична Newtonsoft.Json, но имеет некоторые отличия в синтаксисе и поведении по умолчанию (например, регистрозависимость).
using System.Text.Json;
var person = new Person { Name = "Алексей", Age = 28, Email = "alex@example.com" };
string json = JsonSerializer.Serialize(person, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(json);
// Десериализация
string jsonInput = @"{""Name"":""Ольга"",""Age"":32,""Email"":""olga@example.com""}";
Person deserializedPerson = JsonSerializer.Deserialize<Person>(jsonInput);
Важно! По умолчанию System.Text.Json требует точного совпадения имён свойств (регистрозависимость). Чтобы игнорировать регистр, используйте опцию PropertyNameCaseInsensitive = true.
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
Person p = JsonSerializer.Deserialize<Person>(jsonInput, options);
2.2. Атрибуты в System.Text.Json
Для настройки сериализации используются атрибуты из пространства имён System.Text.Json.Serialization.
using System.Text.Json.Serialization;
public class Product
{
[JsonPropertyName("product_id")]
public int Id