Как преобразовать объект C# в строку JSON в .NET?
Использование System.Text.Json (рекомендуемый способ)
В современном .NET (начиная с .NET Core 3.0 и .NET 5+) стандартным и рекомендуемым способом сериализации объектов в JSON является пространство имён System.Text.Json. Оно встроено в платформу, не требует установки сторонних пакетов и работает очень быстро. Основной класс для сериализации — JsonSerializer.
Вот как выглядит решение вашей задачи:
using System.Text.Json;
public class User
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
// Использование:
User user = new User
{
Name = "Иван Петров",
Age = 30,
Email = "ivan@example.com"
};
// Сериализация в JSON строку
string jsonString = JsonSerializer.Serialize(user);
Console.WriteLine(jsonString);
// Вывод: {"Name":"Иван Петров","Age":30,"Email":"ivan@example.com"}
Настройка сериализации
Часто требуется настроить формат вывода. Например, использовать camelCase для имён свойств (как принято в JavaScript/API) или игнорировать null-значения. Для этого используется класс JsonSerializerOptions:
var options = new JsonSerializerOptions
{
// Имена свойств в camelCase
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
// Игнорировать null значения
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
// Красивое форматирование (с отступами)
WriteIndented = true
};
string jsonString = JsonSerializer.Serialize(user, options);
Console.WriteLine(jsonString);
// Вывод:
// {
// "name": "Иван Петров",
// "age": 30,
// "email": "ivan@example.com"
// }
Работа с атрибутами
Вы можете управлять сериализацией с помощью атрибутов прямо в классе. Например, переименовать свойство или исключить его из JSON:
using System.Text.Json.Serialization;
public class User
{
[JsonPropertyName("full_name")]
public string Name { get; set; }
[JsonIgnore] // Это поле не будет в JSON
public int InternalId { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
Десериализация (обратный процесс)
Чтобы превратить JSON-строку обратно в объект, используется метод JsonSerializer.Deserialize:
string json = @"{""Name"":""Мария"",""Age"":25,""Email"":""maria@test.com""}";
User deserializedUser = JsonSerializer.Deserialize<User>(json);
Console.WriteLine(deserializedUser.Name); // Мария
Важные моменты и best practices
- Чувствительность к регистру: По умолчанию десериализация учитывает регистр. Если ваш JSON приходит в camelCase, а класс использует PascalCase, укажите
PropertyNameCaseInsensitive = trueв настройках. - Обработка ошибок: Всегда оборачивайте сериализацию/десериализацию в try-catch, так как могут возникнуть исключения (например, при несоответствии типов).
- Циклические ссылки: Если у вас есть ссылки друг на друга (например, Employee -> Department -> Employee), используйте
ReferenceHandler.IgnoreCycles. - Производительность: Если вы сериализуете много объектов, создавайте
JsonSerializerOptionsодин раз и переиспользуйте его — это повысит производительность. - Newtonsoft.Json: Если вы работаете с legacy-проектами или нужны очень специфичные настройки, можно использовать Newtonsoft.Json (установить через NuGet). Но для новых проектов Microsoft рекомендует
System.Text.Json.
Этот подход полностью решает вашу задачу и является современным стандартом в .NET экосистеме.
<<Альтернативный подход: Newtonsoft.Json (Json.NET)
Хотя System.Text.Json является стандартом для новых проектов, библиотека Newtonsoft.Json (также известная как Json.NET) остаётся очень популярной, особенно в старых проектах или когда нужны специфические возможности, которых нет в стандартной библиотеке.
Чтобы использовать Newtonsoft.Json, сначала установите пакет через NuGet:
Install-Package Newtonsoft.Json
Пример использования:
using Newtonsoft.Json;
User user = new User { Name = "Анна", Age = 28, Email = "anna@test.com" };
// Базовая сериализация
string json = JsonConvert.SerializeObject(user);
// {"Name":"Анна","Age":28,"Email":"anna@test.com"}
// С настройками (camelCase, форматирование)
string jsonFormatted = JsonConvert.SerializeObject(user, Formatting.Indented, new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
NullValueHandling = NullValueHandling.Ignore
});
// Десериализация
User deserialized = JsonConvert.DeserializeObject<User>(json);
Когда использовать Newtonsoft.Json вместо System.Text.Json?
- Если вам нужно поддерживать
DataTable,DataSetилиXmlNode(System.Text.Json их не поддерживает). - Если нужны сложные конвертеры или кастомная логика сериализации (у Newtonsoft более гибкая модель).
- Если проект уже использует Newtonsoft.Json — нет смысла смешивать две библиотеки.
- Для работы с динамическими типами (
dynamic) и JObject/JArray.
Однако помните: Newtonsoft.Json работает медленнее и потребляет больше памяти, чем System.Text.Json. Для высоконагруженных приложений предпочтительнее использовать встроенную библиотеку.