Как пользоваться
- Вставьте пример JSON. Лучший результат дают массивы с несколькими объектами.
- Решите, будут ли структуры и поля pub и пропускать ли None при сериализации.
- Скопируйте код в свой крейт и разбирайте так:
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)], если лишние ключи должны давать ошибку.