#single #serde #vec

no-std serde_single_or_vec2

可以从序列或单个值反序列化的类型

1个稳定版本

1.0.0 2022年9月9日

1096数据结构

Download history 36/week @ 2024-03-19 31/week @ 2024-03-26 27/week @ 2024-04-02 29/week @ 2024-04-09 56/week @ 2024-04-16 122/week @ 2024-04-23 35/week @ 2024-05-07 21/week @ 2024-05-14 15/week @ 2024-05-21 27/week @ 2024-05-28 113/week @ 2024-06-04 20/week @ 2024-06-11 8/week @ 2024-06-18 31/week @ 2024-06-25 11/week @ 2024-07-02

70 每月下载

MIT/Apache

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一样,需要stdalloc

许可证

许可协议为以下之一

由您选择。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,均应按照上述方式双许可,不得附加任何额外条款或条件。

许可证:MIT OR Apache-2.0

依赖关系

~0.4–1MB
~23K SLoC