3 个不稳定版本
0.2.0 | 2023年6月24日 |
---|---|
0.1.1 | 2023年6月20日 |
0.1.0 | 2023年6月11日 |
#962 in 编码
53KB
1.5K SLoC
serde_structuredqs
这个crate是一个用于序列化和反序列化结构化查询字符串的Rust库。这个crate受到 serde_urlencoded 和 serde_qs 的强烈启发。
示例
基本使用
使用点分隔键序列化嵌套结构。
use serde::Serialize;
#[derive(Serialize)]
struct Parent {
key1: String,
key2: Option<String>,
child: Child,
}
#[derive(Serialize)]
struct Child {
key3: i32,
key4: Option<i32>,
}
assert_eq!(
serde_structuredqs::to_string(&Parent {
key1: String::from("foo"),
key2: Some(String::from("ほげ")),
child: Child {
key3: 100,
key4: None,
}
})
.unwrap(),
String::from("key1=foo&key2=%E3%81%BB%E3%81%92&child.key3=100")
)
然后将具有点分隔键的查询字符串反序列化为嵌套结构。
use serde::Deserialize;
#[derive(Debug, Deserialize, Eq, PartialEq)]
struct Parent {
key1: String,
key2: Option<String>,
child: Child,
}
#[derive(Debug, Deserialize, Eq, PartialEq)]
struct Child {
key3: i32,
key4: Option<i32>,
}
assert_eq!(
serde_structuredqs::from_str::<Parent>(
"key1=foo&key2=%E3%81%BB%E3%81%92&child.key3=100"
)
.unwrap(),
Parent {
key1: String::from("foo"),
key2: Some(String::from("ほげ")),
child: Child {
key3: 100,
key4: None,
}
}
)
Vec 支持
类型为 Vec
的字段值被序列化为逗号分隔的字符串。
use serde::Serialize;
#[derive(Serialize)]
struct MyStruct {
key: Vec<i32>,
}
assert_eq!(
serde_structuredqs::to_string(&MyStruct {
key: vec![100, 200],
}).unwrap(),
String::from("key=100%2C200")
)
同样,逗号分隔的值被反序列化为 Vec
。
use serde::Deserialize;
#[derive(Debug, Deserialize, Eq, PartialEq)]
struct MyStruct {
key: Vec<String>,
}
assert_eq!(
serde_structuredqs::from_str::<MyStruct>(
"key=foo%2Cbar%2C%E3%81%BB%E3%81%92%2C%E3%81%B5%E3%81%8C"
)
.unwrap(),
MyStruct {
key: vec![
String::from("foo"),
String::from("bar"),
String::from("ほげ"),
String::from("ふが"),
]
}
)
依赖
~0.5–1.1MB
~25K SLoC