1 个不稳定版本
0.2.0 | 2023年2月19日 |
---|
#16 在 #data-query
134 每月下载量
在 2 个crate中使用(通过 serde-query-derive)
81KB
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()
);
注意
此库为每个查询段生成Rust类型(例如,.commit
、.commit.message
等),可能会导致二进制膨胀和编译时间变长。
许可证
在以下许可证中选择一个
- 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
~37K SLoC