我想使用Serde从Bowserinator on github反序列化化学元素JSON文件。为此,我创建了所有必要的字段的结构和衍生所需的宏:如何使用Serde反序列化包含空值的JSON文件?
#[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,
}
这工作得很好,直到它到达它包含一个“空”值字段。 例如在氦气中的场地"color": null,
。
我得到的错误消息是{ code: Message("invalid type: unit value, expected a string"), line: 8, column: 17 }
这个字段。
我试用了#[serde(default)]
宏。但是这只适用于JSON文件中缺少字段的情况,而不是当存在null
值时。
我喜欢用避免编程访问者特征的标准宏进行反序列化。有没有我想念的招数?
这是**强烈推荐**你读[*锈病编程语言*](https://doc.rust-lang.org/stable/book/),其涵盖了Rust中非常普遍的'Option'和'Result'的概念。 – Shepmaster
我已经这样做了,但提示将有助于如何处理这种情况,因为它似乎需要考虑与我预期的有点不同。正如我上面所说的,我的假设是我需要实现访问者特征,并且我想避免这种情况。正如我下面所说的:我还想避免再次解析所有读取的结构,并希望Serde具有某种帮助的魔力。 – Hartmut
如果你提供了[MCVE],你的问题会更清楚。原来,你已经提供了代码和输入,但不是你想要的输出*。正如你所看到的,你提出的含糊不清的结果导致了两个截然不同的答案。 – Shepmaster