1个稳定版本
1.0.0 | 2022年9月9日 |
---|
1096 在 数据结构
70 每月下载
22KB
400 代码行
serde_single_or_vec
此crate提供SingleOrVec
类型,允许使用serde解析单个类型T或类型T的向量。当服务器根据值的多寡返回数组或单个值时,这是必需的。
示例
#[derive(Deserialize, Serialize)]
struct Response {
single: SingleOrVec<'static, u8>,
multiple: SingleOrVec<'static, u8>,
}
let json = r#"{
"single": 0,
"multiple": [
0,
1,
2
]
}"#;
let res: Response = serde_json::from_str(json).unwrap();
assert_eq!(json, &serde_json::to_string_pretty(&res).unwrap());
格式
默认情况下,SingleOrVec
类型将内容反序列化为单个值或包含多个值时的数组。要更改此行为,可以定义输出格式。
#[derive(Deserialize, Serialize)]
struct Response {
single: SingleOrVec<'static, u8>,
multiple: SingleOrVec<'static, u8>,
}
let json = "[0]";
let res: SingleOrVec<'_, u8, PreferSingle> = serde_json::from_str(json).unwrap();
assert_eq!("0", &serde_json::to_string(&res).unwrap());
let res: SingleOrVec<'_, u8, AlwaysVector> = serde_json::from_str(json).unwrap();
assert_eq!("[0]", &serde_json::to_string(&res).unwrap());
存储后端
默认后端是一个Vec<T>
,因此总是会导致分配。另一种选择是使用Cow<'_, T>
作为后端,它仅需要为单个值分配。
注意,这仅在使用或序列化此值时有效,由于serde#1852,反序列化始终会分配。
let json = "[0,1,2]";
let res: SingleOrVec<'_, u8, PreferSingle, Cow<'_, [u8]>> = serde_json::from_str(json).unwrap();
assert_eq!(json, &serde_json::to_string(&res).unwrap());
自定义存储类型
还可以通过使用Storage
特质来实现自定义存储后端。
use arrayvec::ArrayVec;
struct ArrayVecStorage {}
impl<T> Storage<'_, T> for ArrayVecStorage {
type Backing = ArrayVec<[T; 4]>;
fn single(ty: T) -> Self::Backing {
let mut vec = ArrayVec::new();
vec.push(ty);
vec
}
fn get_first_with_len(b: &Self::Backing) -> Option<(&T, usize)> {
b.split_first().map(|(t, r)| (t, r.len()))
}
}
let json = "[0,1,2]";
let res: SingleOrVec<'_, u8, PreferSingle, ArrayVecStorage> = serde_json::from_str(json).unwrap();
assert_eq!(json, &serde_json::to_string(&res).unwrap());
let json = "0";
let res: SingleOrVec<'_, u8, PreferSingle, ArrayVecStorage> = serde_json::from_str(json).unwrap();
assert_eq!(json, &serde_json::to_string(&res).unwrap());
no_std
可以使用no_std
使用此crate,但像serde一样,需要std
或alloc
。
许可证
许可协议为以下之一
- Apache许可证第2版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,均应按照上述方式双许可,不得附加任何额外条款或条件。
许可证:MIT OR Apache-2.0
依赖关系
~0.4–1MB
~23K SLoC