我想使用Serde来解析一些JSON作为HTTP PATCH请求的一部分.由于PATCH请求不会传递整个对象,只有要更新的相关数据,我需要能够在未传递的值,显式设置null
的值和存在的值之间进行分析.
我有一个具有多个可空字段的值对象:
struct Resource {
a: Option<i32>,
b: Option<i32>,
c: Option<i32>,
}
Run Code Online (Sandbox Code Playgroud)
如果客户端提交JSON,如下所示:
{"a": 42, "b": null}
Run Code Online (Sandbox Code Playgroud)
我想换a
到Some(42)
,b
对None
,并留下c
不变.
我尝试将每个字段包装在另外一个级别Option
:
#[derive(Debug, Deserialize)]
struct ResourcePatch {
a: Option<Option<i32>>,
b: Option<Option<i32>>,
c: Option<Option<i32>>,
}
Run Code Online (Sandbox Code Playgroud)
这并没有区分b
和c
; 两者都是,None
但我一直想b
成为Some(None)
.
我不依赖于嵌套Option
s的这种表示; 任何可以区分3个案例的解决方案都可以,例如使用自定义枚举的解决方案.
我想使用Serde 在github上反序列化来自Bowserinator的化学元素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,
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,直到它到达包含"null"值的字段.例如,"color": null,
在氦气场.
我得到的错误信息是{ code: Message("invalid type: unit value, expected a string"), line: 8, column: 17 }
这个字段.
我试验了#[serde(default)]
宏.但这仅在JSON文件中缺少字段时才有效,而不是在有null …
我有一个JSON数据流,其中某些JSON对象可能缺少某些字段或具有我事先不知道的字段。
我的解决方案是使用:
let v: Value = serde_json::from_str(data)?;
Run Code Online (Sandbox Code Playgroud)
如何处理该字段stuff
?如果我知道它存在,则可以使用:
v["stuff"]
Run Code Online (Sandbox Code Playgroud)
如果数据stuff
中没有字段,该如何处理?