#serde #query #error #data-query #syntax #streaming #jq-like

serde-query-derive

具有类似jq语法的Serde兼容流式数据查询语言

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

Download history 48/week @ 2024-04-01 75/week @ 2024-04-08 48/week @ 2024-04-15 23/week @ 2024-04-22 19/week @ 2024-04-29 5/week @ 2024-05-06 21/week @ 2024-05-13 6/week @ 2024-05-20 13/week @ 2024-05-27 69/week @ 2024-06-03 37/week @ 2024-06-10 9/week @ 2024-06-17 7/week @ 2024-06-24 31/week @ 2024-07-01 2/week @ 2024-07-08 15/week @ 2024-07-15

每月下载量57次
用于 serde-query

MIT/Apache

86KB
2K SLoC

serde-query

欢迎使用serde-query,这是一个Rust库,让您能够为数据编写类似jq的查询。

为什么选择serde-query?

  1. 效率:使用serde-query,您可以高效地提取所需内容,而不会浪费内存。
  2. 有用的错误信息:当查询失败时,您将收到清晰的、简洁的错误信息,告诉您失败发生的位置和原因。
  3. 灵活性: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-2.0许可证定义,应如上所述双重许可,没有任何附加条款或条件。

依赖项

~3MB
~36K SLoC