【发布时间】:2017-05-26 15:41:23
【问题描述】:
我想使用 Serde 反序列化来自 Bowserinator on github 的化学元素 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,
}
这工作正常,直到它到达包含“空”值的字段。
例如。用于 Helium 中的字段 "color": null,。
我收到的错误消息是 { code: Message("invalid type: unit value, expected a string"), line: 8, column: 17 } 用于该字段。
我尝试了#[serde(default)] 宏。但这仅在 JSON 文件中缺少该字段时有效,而不是在存在 null 值时有效。
我喜欢使用标准宏进行反序列化,避免对访客特征进行编程。有没有我想念的把戏?
【问题讨论】:
-
强烈建议阅读The Rust Programming Language,其中涵盖了
Option和Result的概念,它们在Rust 中非常普遍。 -
我已经这样做了,但是提示如何处理这种情况会有所帮助,因为我似乎需要考虑与我预期的有点不同。正如我上面所说,我的假设是我需要实现访客特征,我想避免这种情况。正如我在下面所说的:我也想避免第二次解析所有读取的结构,并希望 Serde 有一些魔法可以帮助。
-
如果您提供minimal reproducible example,您的问题会更清楚。照原样,您提供了代码和输入,但没有提供您想要的输出。如您所见,您提出的模棱两可导致了两个截然不同的答案。
-
好的,谢谢,下次我会这样做。