JSON в структуры Rust (serde)
Создавайте структуры Rust с derive serde Serialize/Deserialize, полями в snake_case, атрибутами rename, Option для null и Vec для массивов по образцу JSON. Бесплатно.
Нужны крейты serde (с derive) и serde_json. Поля в snake_case с #[serde(rename)], если ключ JSON отличается.
Работает п олностью в вашем браузере. Ваши данные никуда не загружаются.
Похожие Инструменты
Просмотреть ВсеЧто такое JSON в Rust?
Вставьте JSON и получите определения struct на Rust, которые десериализуют его через serde. Каждая структура выводит Debug, Clone, Serialize, Deserialize; имена полей — в snake_case, а исходный ключ сохраняется через #[serde(rename = "…")], где это нужно.
Как пользоваться JSON в Rust
- Вставьте образец JSON в поле Входной JSON (либо нажмите Загрузить пример или Открыть файл).
- Задайте Имя корневого типа (по умолчанию
Root). - Скопируйте сгенерированный код Rust или нажмите Скачать, чтобы сохранить его в файл.
Пример
{"id":1,"name":"A","tags":["x"]} use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
pub id: i64,
pub name: String,
pub tags: Vec<String>,
} Когда использовать JSON в Rust
Используйте при написании клиента или CLI на Rust, читающего JSON. Затем доработайте типы — например, u32 для небольших счётчиков или типы chrono для меток времени, — потому что по образцу реальные диапазоны не определить.
Как работает JSON в Rust
Образец обходится рекурсивно, и каждая позиция собирает встреченные в ней типы. Массивы объектов объединяются в один тип: ключ, отсутствующий у части элементов, становится необязательным, ключ, который где-то равен null, получает допустимое значение null, целые числа вперемешку с дробными становятся типом с плавающей точкой, а всё остальное со смешанными типами сводится к динамическому типу. Вложенные объекты становятся собственными именованными типами (PascalCase от ключа, ключи-массивы переводятся в единственное число: orders → Order), а при совпадении имён добавляются числовые суффиксы. В Rust целые числа превращаются в i64, дробные — в f64, строки — в String, логические значения — в bool, массивы — в Vec<T>, значения с null — в Option<T>, а динамические значения или значения только null — в serde_json::Value. Поля, отсутствующие в части образцов, становятся Option<T> с #[serde(default, skip_serializing_if = "Option::is_none")]. Ключевые слова вроде type записываются как сырые идентификаторы (r#type).
Распространенные Случаи Использования
- Десериализация ответа REST API через reqwest + serde
- Описание конфигурационного файла JSON для CLI-утилиты
- Создание типов для обработчика вебхуков
- Преобразование тестовых данных для интеграционных тестов на Rust
Часто Задаваемые Вопросы
Какие крейты нужны?
serde с функцией derive и serde_json: serde = { version = "1", features = ["derive"] } и serde_json = "1".
Почему serde_json::Value?
Он используется, когда ключ смешивает типы или в образце всегда равен null, поэтому конкретный тип Rust безопасно выбрать нельзя.
Почему r#type?
type — ключевое слово Rust; синтаксис сырого идентификатора позволяет использовать его как имя поля, а serde по-прежнему сопоставляет ключ JSON.