Генератор struct Rust из JSON

Вставьте ответ API в JSON и получите структуры Rust, готовые для serde_json. Поля пишутся в snake_case, ключи, которые отличаются от имён, получают #[serde(rename)], а значения, которые бывают null или отсутствуют, становятся Option<T>.

Работает в браузере: всё, что вы вводите, никуда не отправляется.

Как пользоваться

  1. Вставьте пример JSON. Лучший результат дают массивы с несколькими объектами.
  2. Решите, будут ли структуры и поля pub и пропускать ли None при сериализации.
  3. Скопируйте код в свой крейт и разбирайте так: let root: Root = serde_json::from_str(&text)?;.

Как это работает

Пример разбирается в «форму»: каждый ключ со всеми встреченными на этом месте типами. Все объекты одного массива сливаются в одну структуру, поэтому ключ, который есть не везде, становится Option.

  • Каждая структура выводит Debug, Clone, Serialize и Deserialize.
  • Имена структур берутся из ключей: items хранит Vec, customer становится Customer.
  • Массив на верхнем уровне даёт псевдоним типа, например pub type Root = Vec;.

Пример

{"items":[{"sku":"A","note":null,"qty":1},{"sku":"B","note":"x"}]} без pub и с пропуском None даёт:

use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
struct Root {
    items: Vec<Item>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
struct Item {
    sku: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    note: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    qty: Option<i64>,
}

Советы

  • Если все ключи в camelCase, вместо rename у каждого поля можно поставить один #[serde(rename_all = “camelCase”)] на структуру.
  • Сужайте типы, где знаете диапазон: u32 для количеств, u8 для небольших кодов.
  • Добавьте #[serde(deny_unknown_fields)], если лишние ключи должны давать ошибку.

Частые вопросы

Как типы JSON сопоставляются с Rust?

Строки становятся String, true и false — bool, целые числа — i64, остальные — f64 (смесь — f64). Массивы становятся Vec<T>, объекты — отдельными структурами, а место со значениями разных видов — serde_json::Value.

Когда поле становится Option?

Когда в примере там есть null или ключа нет в части объектов массива. Derive из serde разбирает отсутствующее поле Option как None, так что #[serde(default)] не нужен.

Что делает «Не сериализовать None»?

Добавляет #[serde(skip_serializing_if = "Option::is_none")] к каждому полю Option: при сериализации ключи со значением None пропускаются, а не пишутся как null.

Что происходит с ключами вроде userId или type?

Поля пишутся в snake_case: userId становится user_id с #[serde(rename = "userId")]. Ключевое слово Rust, например type, получает подчёркивание — type_ — и rename на исходный ключ.

Какие крейты нужны?

serde с фичей derive и serde_json: в Cargo.toml serde = { version = "1", features = ["derive"] } и serde_json = "1".

Ещё в разделе «Разработчикам»

Все инструменты раздела: Разработчикам ·Обновлено 4 ноября 2026 г.

Настройки конфиденциальности

Google Analytics показывает нам, какими инструментами пользуются и работают ли они. Он может ставить cookie. Ваш выбор сохраняется в этом браузере.