7个版本
0.2.2 | 2024年2月17日 |
---|---|
0.2.1 | 2024年1月23日 |
0.1.3 | 2024年1月22日 |
1738在 解析器实现 中
每月下载量 80
16KB
111 行
一个微小的crate,用于从http GET请求的查询参数中反序列化表单样式数据。基于 Serde 构建。
能够反序列化
- 表单样式简单数组 (
/users?id=3,4,5
),其元素类型T实现了FromStr
特性。 - 任何类型(例如,表单对象:
/users?id=role,admin,firstName,Alex
),以某种方式实现了FromStr
特性(稍微复杂)。
注意:如果您只想使用
FromStr
进行反序列化,您可能只需要 serde_with。
示例代码
反序列化Vec
use deserialize_form_style_query_parameter::{form_vec_deserialize, option_form_vec_deserialize};
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct QueryParams {
id: Option<u32>,
#[serde(deserialize_with = "form_vec_deserialize")]
user_ids: Vec<u8>,
#[serde(deserialize_with = "option_form_vec_deserialize", default)]
user_names: Option<Vec<String>>,
}
fn main() {
let correct_answer = QueryParams {
id: Some(12345),
user_ids: vec![1, 3],
user_names: None,
};
// serde_urlencoded::from_str is executed by axum::extract::Query.
// https://docs.rs/axum/latest/src/axum/extract/query.rs.html#87
// So handler(Query(para)) also works.
let example_params: QueryParams =
serde_urlencoded::from_str("id=12345&user_ids=1,2b,3")
.unwrap();
assert_eq!(example_params, correct_answer);
}
反序列化对象
use deserialize_form_style_query_parameter::pure_from_str;
use serde::{Deserialize, Serialize};
use std::str::FromStr;
#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct Address {
city: String,
postcode: String,
}
impl FromStr for Address {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
// This function might be very complex in actual situations.
let parts: Vec<&str> = s.split(',').collect();
if parts.len() != 4{
return Err(());
}
if !parts[0].eq("city") || !parts[2].eq("postcode") {
return Err(());
}
Ok(Address{
city: parts[1].to_string(),
postcode: parts[3].to_string()
})
}
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct QueryParams {
id: Option<u32>,
#[serde(deserialize_with = "pure_from_str")]
address: Address,
}
fn main() {
let correct_answer = QueryParams {
id: Some(12345),
address: Address {
city: "Teyvat".to_string(),
postcode: "191919".to_string()
}
};
let example_params: QueryParams =
serde_urlencoded::from_str("id=12345&address=city,Teyvat,postcode,191919")
.unwrap();
assert_eq!(example_params, correct_answer);
}
有关更多详细信息和使用方法,请参阅文档。
依赖关系
~0.4–1MB
~24K SLoC