Cómo se usa
- Pega un ejemplo de JSON. Los arrays con varios objetos dan el mejor resultado.
- Elige si los structs y campos son pub y si se omiten los None al serializar.
- Copia el código a tu crate y analiza con
let root: Root = serde_json::from_str(&text)?;.
Cómo funciona
El ejemplo se convierte en una «forma»: cada clave con todos los tipos que aparecen en ese lugar. Todos los objetos de un array se fusionan en un struct, así que una clave que solo está en algunos pasa a Option
- Cada struct deriva Debug, Clone, Serialize y Deserialize.
- Los nombres de struct salen de las claves: items contiene Vec
- , customer pasa a Customer.
- Un array de nivel superior da un alias de tipo, por ejemplo pub type Root = Vec
;.
Ejemplo
{"items":[{"sku":"A","note":null,"qty":1},{"sku":"B","note":"x"}]} sin pub y con Omitir None da:
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>,
}
Consejos
- Si todas las claves están en camelCase, puedes cambiar los rename de cada campo por un solo #[serde(rename_all = “camelCase”)] en el struct.
- Ajusta los tipos cuando conozcas el rango: u32 para cantidades, u8 para códigos pequeños.
- Añade #[serde(deny_unknown_fields)] si las claves de más deben dar error.