Добавить объявление

Сериализация в Rust: делаем JSON плоским и читаемым

При работе с JSON в Rust разработчики часто сталкиваются с излишней вложенностью данных. Особенно это заметно при сериализации сложных структур с вложенными объектами или enum. В результате получаются громоздкие JSON-объекты, которые сложно читать и обрабатывать. К счастью, Serde предлагает элегантное решение этой проблемы.

Пример 1 - упрощение настроек:


#[derive(serde::Serialize)]
struct User {
name: String,
#[serde(flatten)]
settings: Settings,
}

#[derive(serde::Serialize)]
struct Settings {
theme: String,
notifications: bool,
}

Без flatten:

{
"name": "Ivan",
"settings": {
"theme": "dark",
"notifications": true
}
}

С flatten:

{
"name": "Ivan",
"theme": "dark",
"notifications": true
}

Пример 2 - Работа с enum:


#[derive(serde::Serialize)]
struct Order {
id: u32,
#[serde(flatten)]
payment: Payment,
}

#[derive(serde::Serialize)]
enum Payment {
Card { last4: String },
Cash,
}

Результат для карты:

{
"id": 1,
"Card": {
"last4": "1234"
}
}

Поля enum стали частью основного объекта.

Что важно знать:


  • flatten встраивает поля напрямую в родительскую структуру.

  • Идеально для конфигов, DTO, API-ответов.

  • Избегайте конфликта имен полей.

  • Меняет структуру JSON учитывайте обратную совместимость.

Вывод:


#[serde(flatten)] - это минималистичный способ улучшить читаемость JSON, убрав искусственную вложенность. Используйте его, когда вложенные структуры логически принадлежат родительскому объекту, а не являются отдельными сущностями.
15.12.2025 11 216