gpt4 book ai didi

json - 使用 actix_web 对部分结构进行 Serde 反序列化

转载 作者:行者123 更新时间:2023-12-03 11:32:18 24 4
gpt4 key购买 nike

我有一个 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 能够反序列化结构的所有字段时,此端点才会成功返回。 IE。请求必须包含 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,
}

关于json - 使用 actix_web 对部分结构进行 Serde 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60895982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com