[英]Serde deserialization of partial structs with actix_web
我有一個 API 端點,它利用actix_web
反序列化傳入的 JSON 有效負載( actix_web
最終使用serde
進行 JSON 反序列化)。
例如,我有一些看起來像這樣的東西:
pub struct IncomingPayload {
pub field1: i32,
pub field2: String
}
pub async fn update_platforms(
pool: web::Data<Pool>,
req: web::Json<Vec<IncomingPayload>>,
) -> Result<HttpResponse, error::Error> {
println!(req.field1); // will be an i32
println!(req.field2); // will be a String
}
目前,只有當serde
能夠反序列化結構的所有字段時,此端點才會成功返回。 即一個請求必須包含field1
和field2
鍵。
例如,這將是成功的:
curl --header "Content-Type: application/json" \
--request POST \
--data '{"field1": 1,"field2":"something"}' \
http://localhost:8080
但這不會(因為有效負載中缺少field2
):
curl --header "Content-Type: application/json" \
--request POST \
--data '{"field1": 1}' \
http://localhost:8080
所以我的問題是,這能做到嗎? 是否可以將帶有鍵值字段子集的 JSON 有效負載發送到希望所有字段都存在的actix_web
端點?
或者更確切地說,是否有一種通用的方法可以使用actix_web
或serde
反序列化這樣的部分結構?
您可以使用Option<T>
作為字段的類型,使其成為可選的。 如果在反序列化期間缺少字段,則該字段設置為None
,否則設置為Some(value)
。
#[derive(Deserialize)]
struct IncomingPayload {
pub field1: Option<i32>,
pub field2: Option<String>,
}
對於實現Default
類型,如果字段丟失,您還可以使用#[serde(default)]
將該字段設置為默認值。
#[derive(Deserialize)]
struct IncomingPayload {
#[serde(default)] // default = 0
pub field1: i32,
#[serde(default)] // default = empty string
pub field2: String,
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.