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# на протяжении многих лет. Она предлагает богатый функционал, включая гибкую сериализацию, поддержку LINQ to JSON и работу с динамическими типами.
Установка
Для установки через NuGet Package Manager выполните команду:
Install-Package Newtonsoft.Json
Или через .NET CLI:
dotnet add package Newtonsoft.Json
Базовые операции: сериализация и десериализация
Сериализация — это преобразование объекта C# в строку JSON. Десериализация — обратный процесс.
using Newtonsoft.Json;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public List<string> Hobbies { get; set; }
}
// Сериализация
Person person = new Person
{
Name = "Алексей",
Age = 30,
Hobbies = new List<string> { "Программирование", "Чтение", "Путешествия" }
};
string json = JsonConvert.SerializeObject(person, Formatting.Indented);
Console.WriteLine(json);
// Десериализация
string jsonInput = @"{'Name':'Мария','Age':25,'Hobbies':['Рисование','Йога']}";
Person deserializedPerson = JsonConvert.DeserializeObject<Person>(jsonInput);
Console.WriteLine($"Имя: {deserializedPerson.Name}, Возраст: {deserializedPerson.Age}");
Работа с динамическими данными
Newtonsoft.Json поддерживает динамические типы, что удобно при работе с неизвестной структурой JSON.
dynamic dynamicObject = JsonConvert.DeserializeObject("{'Name':'Иван','Score':95.5}");
Console.WriteLine($"Студент: {dynamicObject.Name}, Балл: {dynamicObject.Score}");
LINQ to JSON
Библиотека предоставляет мощный API для запросов к JSON-данным с использованием LINQ.
using Newtonsoft.Json.Linq;
string json = @"{
'users': [
{'name': 'Анна', 'age': 28},
{'name': 'Петр', 'age': 35},
{'name': 'Елена', 'age': 22}
]
}";
JObject obj = JObject.Parse(json);
var youngUsers = obj["users"]
.Where(u => (int)u["age"] < 30)
.Select(u => (string)u["name"]);
foreach (var name in youngUsers)
{
Console.WriteLine(name); // Выведет: Анна, Елена
}
2. System.Text.Json
System.Text.Json — это современная библиотека от Microsoft, оптимизированная для производительности и минимального потребления памяти. Она встроена в .NET и не требует установки дополнительных пакетов.
Базовые операции
using System.Text.Json;
using System.Text.Json.Serialization;
public class Product
{
[JsonPropertyName("product_name")]
public string Name { get; set; }
public decimal Price { get; set; }
[JsonIgnore]
public string InternalCode { get; set; }
}
// Сериализация
Product product = new Product
{
Name = "Ноутбук",
Price = 75000.50m,
InternalCode = "INT-001"
};
string json = JsonSerializer.Serialize(product, new JsonSerializerOptions
{
WriteIndented = true
});
Console.WriteLine(json);
// Десериализация
string jsonInput = @"{""product_name"":""Смартфон"",""Price"":45000.00}";
Product deserializedProduct = JsonSerializer.Deserialize<Product>(jsonInput);
Console.WriteLine($"Товар: {deserializedProduct.Name}, Цена: {deserializedProduct.Price}");
Работа с атрибутами
System.Text.Json предоставляет атрибуты для тонкой настройки сериализации:
[JsonPropertyName]— задаёт имя свойства в JSON[JsonIgnore]— исключает свойство из сериализации[JsonInclude]— включает приватные поля в сериализацию[JsonConverter]— позволяет использовать пользовательский конвертер
Работа с документами JSON
System.Text.Json включает JsonDocument для эффективного чтения больших JSON-файлов без полной десериализации.
using System.Text.Json;
string json = @