JSON обработка в C# (.NET): полное руководство с примерами
JSON (JavaScript Object Notation) — один из самых популярных форматов обмена данными в современных веб-приложениях, API и конфигурационных файлах. В экосистеме .NET разработчикам доступны мощные инструменты для работы с JSON, которые позволяют легко сериализовать объекты в JSON и обратно. В этой статье мы подробно рассмотрим два основных подхода: встроенную библиотеку System.Text.Json (рекомендуется для .NET Core 3.0+ и .NET 5+) и популярную стороннюю библиотеку Newtonsoft.Json (также известную как Json.NET).
1. System.Text.Json — современный стандарт .NET
Начиная с .NET Core 3.0, Microsoft представила собственную высокопроизводительную библиотеку для работы с JSON — System.Text.Json. Она оптимизирована для минимального потребления памяти и высокой скорости, что делает её идеальным выбором для новых проектов.
1.1. Установка и импорт
Библиотека уже встроена в .NET 5/6/7/8/9, поэтому дополнительная установка не требуется. Для её использования достаточно подключить пространство имен:
using System.Text.Json;
using System.Text.Json.Serialization;
1.2. Базовая сериализация и десериализация
Рассмотрим простой пример: сериализация объекта в JSON и обратно.
// Определяем класс
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public bool IsEmployed { get; set; }
}
// Сериализация
var person = new Person { Name = "Иван", Age = 30, IsEmployed = true };
string json = JsonSerializer.Serialize(person);
Console.WriteLine(json); // {"Name":"Иван","Age":30,"IsEmployed":true}
// Десериализация
var deserializedPerson = JsonSerializer.Deserialize<Person>(json);
Console.WriteLine(deserializedPerson.Name); // Иван
1.3. Работа с атрибутами
System.Text.Json поддерживает атрибуты для тонкой настройки сериализации:
public class Product
{
[JsonPropertyName("product_id")]
public int Id { get; set; }
[JsonIgnore]
public string InternalCode { get; set; }
[JsonConverter(typeof(JsonStringEnumConverter))]
public ProductCategory Category { get; set; }
}
public enum ProductCategory
{
Electronics,
Clothing,
Food
}
var product = new Product
{
Id = 101,
InternalCode = "SECRET",
Category = ProductCategory.Electronics
};
string json = JsonSerializer.Serialize(product);
// {"product_id":101,"Category":"Electronics"}
// InternalCode не попал в JSON благодаря [JsonIgnore]
1.4. Параметры сериализации
Вы можете настроить поведение сериализатора через JsonSerializerOptions:
var options = new JsonSerializerOptions
{
WriteIndented = true, // Красивый вывод с отступами
PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // camelCase для свойств
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull // Игнорировать null
};
string prettyJson = JsonSerializer.Serialize(person, options);
Console.WriteLine(prettyJson);
/* Вывод:
{
"name": "Иван",
"age": 30,
"isEmployed": true
}
*/
2. Newtonsoft.Json (Json.NET) — проверенный временем инструмент
До появления System.Text.Json, Newtonsoft.Json был де-факто стандартом для работы с JSON в .NET. Он предлагает более гибкие настройки и широкий набор функций, хотя и уступает в производительности.
2.1. Установка
Для использования Newtonsoft.Json необходимо установить NuGet-пакет:
// Через Package Manager Console:
Install-Package Newtonsoft.Json
// Или через .NET CLI:
dotnet add package Newtonsoft.Json
2.2. Базовая работа
using Newtonsoft.Json;
public class Order
{
public int OrderId { get; set; }
public decimal TotalAmount { get; set; }
public DateTime CreatedAt { get; set; }
}
// Сериализация
var order = new Order
{
OrderId = 42,
TotalAmount = 1500.50m,
CreatedAt = DateTime.Now
};
string json = JsonConvert.SerializeObject(order);
Console.WriteLine(json);
// Десериализация
var deserializedOrder = JsonConvert.DeserializeObject<Order>(json);
Console.WriteLine(deserializedOrder.OrderId); // 42
2.3. Расширенные возможности
Newtonsoft.Json предоставляет гибкие настройки через JsonSerializerSettings:
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
NullValueHandling = NullValueHandling.Ignore,
DateFormatString = "yyyy-MM-dd",
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
string json = JsonConvert.SerializeObject(order, settings);
Console.WriteLine(json);
/* Вывод:
{
"orderId":