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

Ham*_*mza 3 rust serde serde-json

我希望反序列化使空数组失败。以下代码有效,但我想让这个特定案例失败:

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);
}
Run Code Online (Sandbox Code Playgroud)

有什么选择可以实现这一目标?

Hol*_*way 6

您可以使用自定义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);
}
Run Code Online (Sandbox Code Playgroud)