#query-string #serialization #structured #nested #deserialize #serialize-deserialize #key

serde_structuredqs

一个用于序列化和反序列化结构化查询字符串的Rust库

3 个不稳定版本

0.2.0 2023年6月24日
0.1.1 2023年6月20日
0.1.0 2023年6月11日

#962 in 编码

Apache-2.0

53KB
1.5K SLoC

serde_structuredqs

这个crate是一个用于序列化和反序列化结构化查询字符串的Rust库。这个crate受到 serde_urlencodedserde_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