Перейти к содержанию

JSON в структуру Rust

Преобразуйте JSON-документ в структуры Rust, готовые к использованию с serde.

Входные данные
Выходные данные

JSON в структуру Rust

Вставьте JSON-объект или массив, и этот инструмент сгенерирует соответствующие структуры Rust, готовые к использованию в проекте, который применяет serde для сериализации. Это экономит время на ручное написание типов полей и атрибутов derive каждый раз, когда меняется структура ответа API или файла конфигурации.

Опции контролируют внешний вид сгенерированного кода. Выберите, какие трейты производить — Debug, Clone, Serialize, Deserialize, PartialEq — и добавлять ли #[serde(rename_all = "camelCase")] для того, чтобы идиоматические snake_case-поля Rust корректно десериализовали camelCase-ключи JSON. Null-значения могут автоматически преобразоваться в Option<T>, а для целых чисел вы можете выбрать i32, i64 или u64, а для текста — String или заимствованный &str (с временем жизни). Вложенные объекты могут генерироваться как отдельные структуры верхнего уровня или быть обёрнуты в свой pub mod, а поля могут быть открытыми или приватными.

Массивы объектов объединяются в одну структуру: поле, присутствующее только на некоторых элементах, автоматически становится Option<T>, поэтому структура, сгенерированная из нескольких примеров записей, всё равно совпадает с полным набором данных. Имена полей преобразуются в snake_case, ключевые слова Rust превращаются в raw identifiers, такие как r#type, а имя, которое нельзя чисто представить, сохраняет исходный ключ через атрибут #[serde(rename = "...")] вместо этого.

Всё выполняется локально в вашем браузере — ваш JSON никогда не загружается никуда, поэтому безопасно вставлять реальные API-запросы или данные конфигурации. Скопируйте сгенерированный код, загрузите его как файл .txt или отправьте вывод обратно во входные данные для дальнейшей доработки.

FAQ

Устанавливает ли он serde или добавляет его в Cargo.toml?
Нет. Он только генерирует код структуры. Добавьте serde с функцией derive в ваш Cargo.toml отдельно: serde = { version = "1", features = ["derive"] }.
Что происходит с полем, которое имеет значение null в некоторых записях и присутствует в других?
Когда включена опция «Обернуть null-значения в Option<T>», это поле становится Option<T>, поэтому оно корректно десериализуется независимо от того, присутствует ли оно, имеет значение null или отсутствует.
Почему поле получает атрибут #[serde(rename = "...")]?
Это происходит, когда переименование в camelCase отключено и ключ JSON не совпадает с сгенерированным snake_case-именем поля Rust, поэтому исходный ключ сохраняется для десериализации.
Может ли он генерировать структуры из массива на верхнем уровне?
Да. Массив объектов создаёт alias типа типа pub type Root = Vec<Item>; плюс структура Item, объединяя поля со всех элементов массива.
Загружается ли мой JSON куда-нибудь?
Нет. Генерирование структур выполняется полностью в вашем браузере — ваш JSON никогда не покидает ваше устройство.