gpt4 book ai didi

rust - 使用反序列化时是否可以自动忽略结构字段

转载 作者:行者123 更新时间:2023-12-05 03:37:02 27 4
gpt4 key购买 nike

我使用 Rust Rocket 作为 http 服务器端。在服务器端,我定义了一个像这样的 Rust 结构来接收来自客户端的数据:

#[derive(Deserialize, Serialize)]
#[allow(non_snake_case)]
pub struct PlayRecordRequest {
pub id: i64,
pub title: String,
pub url: String,
pub mvId: i64,
pub album: MusicAlbum,
pub artist: Vec<Artist>,
}

并像这样在 http Controller 中接收:

#[post("/user/v1/save-play-record", data = "<record>")]
pub fn save_play_record<'r>(
record: Json<PlayRecordRequest>,
) -> content::Json<String> {
info!("save play record,title:{}",record.title);
save_play_record_impl(record);
let res = ApiResponse {
result: "ok".to_string(),
..Default::default()
};
let result_json = serde_json::to_string(&res).unwrap();
return content::Json(result_json);
}

问题是当客户端没有某些字段时,代码会出错。是否可以自动适应反序列化的字段,如果客户端有字段,正常反序列化它,如果客户端不包含一些字段,就忽略它,不要出错。看了serde的官方文档,找到了skip annotation .但是只用于标记字段的注释应该被忽略,我想要的是该结构可以自动适应所有存在或不存在的字段。可以这样做吗?

最佳答案

有两种处理方法。

首先是选项。选项暗示数据可能存在也可能不存在。如果数据为 null 或丢失,则将其转换为 Option::none 值。如果添加 #[serde(skip_serializing_if = "Option::is_none")]

,则可以保留序列化数据的缺失

第二个选项是在数据缺失时对值应用默认值。尽管从您的用例来看,这似乎并不理想。

这是您可以在 https://play.rust-lang.org/ 上运行的两种情况的代码片段:

use::serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Debug)]
#[allow(non_snake_case)]
pub struct Foo {
#[serde(skip_serializing_if = "Option::is_none")]
pub bar: Option<i64>,
#[serde(default = "default_baz")]
pub baz: i64,
}

fn default_baz()-> i64{
3
}

fn main(){
let data = r#"{"bar": null, "baz": 1}"#;
let v: Foo = serde_json::from_str(data).unwrap();
println!("{:#?}", v);

let s = serde_json::to_string(&v).unwrap();
println!("Don't serialize None values: {:#?}", s);

let data = r#"{"missing_bar": null}"#;
let v: Foo = serde_json::from_str(data).unwrap();
println!("{:#?}", v)

}

关于rust - 使用反序列化时是否可以自动忽略结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69470414/

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