rust serde如何在反序列化空数组时出错

6tqwzwtp  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(131)

我希望反序列化失败的空数组。下面的代码工作,但我想使这个特定的情况失败:

use serde::Deserialize;

#[derive(Debug)]
#[derive(Deserialize)]
struct Doc {
    nums: Vec<i32>
}

fn main(){
    let data = r#"
        {"nums": []}
    "#;
    let doc: Doc = serde_json::from_str(data).unwrap();
    dbg!(doc);
}

实现这一目标有哪些选择?

carvr3hs

carvr3hs1#

您可以使用自定义deserialize_with函数

use serde::{de::Deserializer, de::Error, Deserialize};

#[derive(Debug, Deserialize)]
struct Doc {
    #[serde(deserialize_with = "non_empty")]
    nums: Vec<i32>,
}

fn non_empty<'de, D, T>(d: D) -> Result<Vec<T>, D::Error>
where
    D: Deserializer<'de>,
    T: Deserialize<'de>,
{
    let vec = <Vec<T>>::deserialize(d)?;
    if vec.is_empty() {
        Err(D::Error::custom("need non-empty"))
    } else {
        Ok(vec)
    }
}

fn main() {
    let data = r#"
        {"nums": []}
    "#;
    let doc: Doc = serde_json::from_str(data).unwrap();
    dbg!(doc);
}

相关问题