【问题标题】:is it possible to auto ignore the struct fields when using Deserialize使用反序列化时是否可以自动忽略结构字段
【发布时间】: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)]

标签: rust serde


【解决方案1】:

有两种方法可以解决这个问题。

首先是选项。选项意味着数据可能存在也可能不存在。如果数据为 null 或缺失,则将其转换为 Option::none 值。如果添加#[serde(skip_serializing_if = "Option::is_none")],则可以保留序列化数据的缺失

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

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

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)
    
}

【讨论】:

    猜你喜欢
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多