Struct serde_with::StringWithSeparator
source · pub struct StringWithSeparator<Sep, T>(_);
Expand description
De/Serialize a delimited collection using Display
and FromStr
implementation
StringWithSeparator
takes a second type, which needs to implement Display
+FromStr
and constitutes the inner type of the collection.
You can define an arbitrary separator, by specifying a type which implements Separator
.
Some common ones, like space and comma are already predefined and you can find them here.
An empty string deserializes as an empty collection.
Examples
use serde_with::formats::{CommaSeparator, SpaceSeparator};
use std::collections::BTreeSet;
#[serde_as]
#[derive(Deserialize, Serialize)]
struct A {
#[serde_as(as = "StringWithSeparator::<SpaceSeparator, String>")]
tags: Vec<String>,
#[serde_as(as = "StringWithSeparator::<CommaSeparator, String>")]
more_tags: BTreeSet<String>,
}
let v: A = serde_json::from_str(r##"{
"tags": "#hello #world",
"more_tags": "foo,bar,bar"
}"##).unwrap();
assert_eq!(vec!["#hello", "#world"], v.tags);
assert_eq!(2, v.more_tags.len());
let x = A {
tags: vec!["1".to_string(), "2".to_string(), "3".to_string()],
more_tags: BTreeSet::new(),
};
assert_eq!(
r#"{"tags":"1 2 3","more_tags":""}"#,
serde_json::to_string(&x).unwrap()
);
Trait Implementations§
source§impl<'de, SEPARATOR, I, T> DeserializeAs<'de, I> for StringWithSeparator<SEPARATOR, T>where
SEPARATOR: Separator,
I: FromIterator<T>,
T: FromStr,
T::Err: Display,
impl<'de, SEPARATOR, I, T> DeserializeAs<'de, I> for StringWithSeparator<SEPARATOR, T>where SEPARATOR: Separator, I: FromIterator<T>, T: FromStr, T::Err: Display,
source§fn deserialize_as<D>(deserializer: D) -> Result<I, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<I, D::Error>where D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer.
source§impl<SEPARATOR, I, T> SerializeAs<I> for StringWithSeparator<SEPARATOR, T>where
SEPARATOR: Separator,
for<'x> &'x I: IntoIterator<Item = &'x T>,
T: Display,
impl<SEPARATOR, I, T> SerializeAs<I> for StringWithSeparator<SEPARATOR, T>where SEPARATOR: Separator, for<'x> &'x I: IntoIterator<Item = &'x T>, T: Display,
source§fn serialize_as<S>(source: &I, serializer: S) -> Result<S::Ok, S::Error>where
S: Serializer,
fn serialize_as<S>(source: &I, serializer: S) -> Result<S::Ok, S::Error>where S: Serializer,
Serialize this value into the given Serde serializer.