Конвертер JSON в структуры Rust
Генерируйте из примера JSON структуры Rust с derive Serialize и Deserialize из serde.
Генерация структур serde из JSON
В Rust JSON обычно читают, десериализуя его в структуры с помощью serde и serde_json. Конвертер пишет такие структуры по примеру: каждый объект становится структурой с #[derive(Serialize, Deserialize)], вложенные объекты получают собственные структуры, массивы становятся Vec<T>, целые числа — i64, дробные — f64, а строки — String. Имена полей сохраняются в snake_case, а если ключ JSON не является допустимым идентификатором в snake_case, добавляется атрибут #[serde(rename = "...")].
Как пользоваться
- Вставьте пример JSON — например, полезную нагрузку события или файл конфигурации.
- Введите имя корневой структуры, например Event.
- Добавьте в Cargo.toml serde (с фичей derive) и serde_json, вставьте структуры в модуль и разбирайте данные через serde_json::from_str::<Event>(&text).
Часто задаваемые вопросы
- Почему поля приватные?
- Генератор оставляет поля без pub — для работы serde внутри модуля этого достаточно. Добавьте pub к полям, которые нужно читать из других модулей.
- Как представлены необязательные поля?
- Если поле равно null или отсутствует в части элементов примера, оно генерируется как Option<T>, и serde принимает оба варианта. Поля, которые присутствуют всегда, получают обычные типы, и их отсутствие приводит к ошибке десериализации.
- Какие крейты нужны?
- Добавьте serde с features = ["derive"] и serde_json. Комментарий в начале результата также показывает устаревший стиль с extern crate, который в современных редакциях Rust не нужен.
Пример: JSON в Rust
Исходный JSON
{
"event_type": "page_view",
"timestamp": 1735689600,
"user_id": "u_123",
"properties": { "path": "/pricing", "referrer": "google" }
}Сгенерированный код: Rust (Event)
// Example code that deserializes and serializes the model.
// extern crate serde;
// #[macro_use]
// extern crate serde_derive;
// extern crate serde_json;
//
// use generated_module::Event;
//
// fn main() {
// let json = r#"{"answer": 42}"#;
// let model: Event = serde_json::from_str(&json).unwrap();
// }
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
pub struct Event {
event_type: String,
timestamp: i64,
user_id: String,
properties: Properties,
}
#[derive(Serialize, Deserialize)]
pub struct Properties {
path: String,
referrer: String,
}