При работе с
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, убрав искусственную вложенность. Используйте его, когда вложенные структуры логически принадлежат родительскому объекту, а не являются отдельными сущностями.