Je veux désérialiser le fichier JSON des éléments chimiques de Bowserinator on github en utilisant Serde. Pour cela, je créé une structure avec tous les champs nécessaires et tirais les macros nécessaires:Comment désérialiser un fichier JSON contenant des valeurs nulles en utilisant Serde?
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Element {
name: String,
appearance: String,
atomic_mass: f64,
boil: f64,
category: String,
#[serde(default)]
color: String,
density: f64,
discovered_by: String,
melt: f64,
#[serde(default)]
molar_heat: f64,
named_by: String,
number: String,
period: u32,
phase: String,
source: String,
spectral_img: String,
summary: String,
symbol: String,
xpos: u32,
ypos: u32,
}
Cela fonctionne bien jusqu'à ce qu'il soit à des champs qui contiennent une valeur « null ». E.g. pour le champ "color": null,
en hélium.
Le message d'erreur que j'obtiens est { code: Message("invalid type: unit value, expected a string"), line: 8, column: 17 }
pour ce champ. J'ai expérimenté la macro #[serde(default)]
. Mais cela ne fonctionne que lorsque le champ est manquant dans le fichier JSON, et non lorsqu'il y a une valeur null
. J'aime faire la désérialisation avec les macros standard en évitant de programmer un trait de visiteur. Y a-t-il un truc qui me manque?
Il est fortement recommandé ** ** que vous avez lu (https://doc.rust-lang.org/stable/book/) [* La programmation Rust Langue *], qui couvre le concept de 'Option' et' Result', qui sont très répandus dans Rust. – Shepmaster
Je l'ai déjà fait, mais un indice serait utile pour gérer ce cas, car il semble que je doive penser un peu différent de ce à quoi je m'attendais. Comme je l'ai dit ci-dessus, mon hypothèse est que j'ai besoin de mettre en œuvre le trait de visiteur et je voulais éviter cela. Comme je l'ai dit ci-dessous: Je voulais aussi éviter d'analyser toutes les Structures lues une seconde fois et j'espérais que Serde ait une sorte de magie pour aider. – Hartmut
Votre question serait plus claire si vous fournissiez un [MCVE]. En l'état, vous avez fourni le code et l'entrée, mais pas ce que vous voulez *. Comme vous pouvez le voir, l'ambiguïté que vous avez présentée a donné lieu à deux réponses radicalement différentes. – Shepmaster