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

  1. Вставьте образец JSON в поле Входной JSON (либо нажмите Загрузить пример или Открыть файл).
  2. Задайте Имя корневого типа (по умолчанию Root).
  3. Скопируйте сгенерированный код 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.

Другие категории