Blank
Blank

Reputation: 443

serde how to error out when deserializing empty arrays

I want de-serialization to fail empty arrays. The following code works, but I want to make this specific case fail:

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

What options exist to achieve this?

Upvotes: 3

Views: 409

Answers (1)

Holloway
Holloway

Reputation: 7367

You could use a custom deserialize_with function

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

Upvotes: 6

Related Questions