【发布时间】:2021-10-06 17:46:39
【问题描述】:
我使用 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 控制器中接收:
#[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的官方文档,找到了skipannotation。但是应该忽略仅用于标记字段的注释,我想要的是该结构可以自动适应所有字段是否存在。这样可以吗?
【问题讨论】:
-
我想你在找
#[serde(default)]。