我想使用Serde解析一些JSON作为HTTP PATCH请求的一部分。由于PATCH请求不会传递整个对象,只有相关的数据需要更新,所以我需要能够告诉未传递的值,明确设置为null
的值和存在的值。如何区分缺失的反序列化字段和空字符?
我有多个可空字段的值对象:
struct Resource {
a: Option<i32>,
b: Option<i32>,
c: Option<i32>,
}
如果客户提交JSON是这样的:
{"a": 42, "b": null}
我想改变a
到Some(42)
,b
到None
,并保持c
不变。
我试图在Option
一个多级包装的每个字段:
#[derive(Debug, Deserialize)]
struct ResourcePatch {
a: Option<Option<i32>>,
b: Option<Option<i32>>,
c: Option<Option<i32>>,
}
但是这并没有使b
和c
之间的区别;都是None
,但我想要b
为Some(None)
。
我没有绑定到嵌套Option
s的这种表示形式;任何可以区分3种情况的解决方案都可以,例如使用自定义枚举的解决方案。
“理想情况下,为'Patch'执行'Deserialize'可以完全处理”我的假设到目前为止是不可能的。从您尝试反序列化“Patch”的那一刻起,您希望该值以其序列化形式存在。相反,'Patch :: Missing'通过它的“不存在”存在于我们的容器中(你实际上不能将Patch :: Missing'自己序列化为JSON)。 AFAIK a“序列化”不能选择不序列化,也不能告诉容器跳过该部分过程。 –
其实,我以前的评论更适用于序列化,而不是反序列化。无论如何,逻辑有点双重:“反序列化”无法告诉“反序列化器”对它无法找到的值进行反序列化。如果我们有一个空的对象'{}','Deserialize'的实现无能为力,但是解串器可以在知道填充默认值之后。 –