簡體   English   中英

使用 actix_web 對部分結構進行 Serde 反序列化

[英]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能夠反序列化結構的所有字段時,此端點才會成功返回。 即一個請求必須包含field1field2鍵。

例如,這將是成功的:

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_webserde反序列化這樣的部分結構?

您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM