7个版本
0.2.0 | 2023年2月19日 |
---|---|
0.1.5 | 2023年2月5日 |
0.1.4 | 2021年11月2日 |
0.1.3 | 2020年9月13日 |
#17 在 #data-query
每月下载量57次
用于 serde-query
86KB
2K SLoC
serde-query
欢迎使用serde-query,这是一个Rust库,让您能够为数据编写类似jq的查询。
为什么选择serde-query?
- 效率:使用serde-query,您可以高效地提取所需内容,而不会浪费内存。
- 有用的错误信息:当查询失败时,您将收到清晰的、简洁的错误信息,告诉您失败发生的位置和原因。
- 灵活性:serde-query支持任何与Serde兼容的数据格式。
入门指南
要开始使用serde-query,请使用Cargo将其添加到您的Rust项目中
cargo add serde-query
或者,将其添加到您的 Cargo.toml
[dependencies]
serde-query = "0.2.0"
示例
数组查询
use serde_query::{DeserializeQuery, Query};
#[derive(DeserializeQuery)]
struct Data {
#[query(".commits.[].author")]
authors: Vec<String>,
#[query(".count")]
count: usize,
}
let document = serde_json::json!({
"commits": [
{ "author": "Kou", "hash": 0x0202 },
{ "author": "Kasumi", "hash": 0x1013 },
{ "author": "Masaru", "hash": 0x0809 },
],
"count": 3,
}).to_string();
// You can use `Query<T>` as a `Deserialize` type for any `Deserializer`
// and convert the result to the desired type using `From`/`Into`.
let data: Data = serde_json::from_str::<Query<Data>>(&document)?.into();
assert_eq!(data.authors, vec!["Kou", "Kasumi", "Masaru"]);
assert_eq!(data.count, 3);
错误
use serde_query::Deserialize;
#[derive(Debug, Deserialize)]
struct Data {
// missing field
#[query(".author.name")]
author_name: String,
// typo
#[query(".commit.commiter.name")]
committer_name: String,
// type error
#[query(".author.id")]
id: String,
}
let error = serde_json::from_str::<Data>(INPUT).unwrap_err();
assert_eq!(
error.to_string(),
r#"
Queries failed for fields: 'author_name', 'committer_name', 'id'
1. Query for field 'author_name' failed at '.author': missing field 'name'
2. Query for field 'committer_name' failed at '.commit': missing field 'commiter'
3. Query for field 'id' failed at '.author.id': invalid type: integer `5635139`, expected a string at line 34 column 17
"#
.trim_start()
);
注意
此库为每个查询段(例如,.commit
、.commit.message
等)生成Rust类型,这可能导致二进制膨胀和更长的编译时间。
许可
以下任一许可下授权
- Apache License,版本2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任您选择。
贡献
除非您明确声明,否则您提交给作品以包含在内的任何贡献,根据Apache-2.0许可证定义,应如上所述双重许可,没有任何附加条款或条件。
依赖项
~3MB
~36K SLoC