Como posso distinguir entre um campo desserializado que está faltando e um que é nulo?
Eu gostaria de usarSerde analisar alguns JSON como parte de uma solicitação HTTP PATCH. Como as solicitações PATCH não passam o objeto inteiro, apenas os dados relevantes a serem atualizados, eu preciso saber entre um valor que não foi passado, um valor que foi explicitamente definido comonull
e um valor presente.
Eu tenho um objeto de valor com vários campos anuláveis:
struct Resource {
a: Option<i32>,
b: Option<i32>,
c: Option<i32>,
}
Se o cliente enviar JSON assim:
{"a": 42, "b": null}
Eu gostaria de mudara
paraSome(42)
, b
paraNone
, e sairc
inalterado.
Tentei agrupar cada campo em mais um nível deOption
:
#[derive(Debug, Deserialize)]
struct ResourcePatch {
a: Option<Option<i32>>,
b: Option<Option<i32>>,
c: Option<Option<i32>>,
}
Isso não faz distinção entreb
ec
; ambos sãoNone
mas eu queriab
ser estarSome(None)
.
Eu não estou vinculado a essa representação de aninhadoOption
s; qualquer solução que possa distinguir os três casos seria adequada, como uma que usa uma enumeração personalizada.