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