#serde #query #data-query #streaming #error-message #syntax #memory

serde-query

基于 serde 的类似 jq 的语法流式数据查询语言

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 日

#593编码

Download history 303/week @ 2024-03-12 112/week @ 2024-03-19 14/week @ 2024-03-26 43/week @ 2024-04-02 67/week @ 2024-04-09 48/week @ 2024-04-16 16/week @ 2024-04-23 15/week @ 2024-04-30 4/week @ 2024-05-07 12/week @ 2024-05-14 4/week @ 2024-05-21 13/week @ 2024-05-28 72/week @ 2024-06-04 16/week @ 2024-06-11 4/week @ 2024-06-18 1/week @ 2024-06-25

每月 98 下载量
rs-youtube 中使用

MIT/Apache

22KB
150

serde-query

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

为什么要使用 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()
);

注意

此库为每个查询段生成 Rust 类型(例如,.commit.commit.message 等),可能会导致二进制膨胀和编译时间变长。

许可证

根据以下任一许可证授权

任选其一。

贡献

除非您明确表示,否则根据 Apache-2.0 许可证定义,您提交的任何有意提交以包含在作品中的贡献,将根据上述方式双许可,不附加任何其他条款或条件。

依赖项

~110–590KB