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

serde-query-core

类似jq的语法风格的Serde兼容流数据查询语言

1 个不稳定版本

0.2.0 2023年2月19日

#16#data-query

Download history 177/week @ 2024-03-11 122/week @ 2024-03-18 47/week @ 2024-03-25 38/week @ 2024-04-01 81/week @ 2024-04-08 52/week @ 2024-04-15 27/week @ 2024-04-22 22/week @ 2024-04-29 10/week @ 2024-05-06 26/week @ 2024-05-13 8/week @ 2024-05-20 15/week @ 2024-05-27 71/week @ 2024-06-03 40/week @ 2024-06-10 13/week @ 2024-06-17 10/week @ 2024-06-24

134 每月下载量
2 个crate中使用(通过 serde-query-derive

MIT/Apache

81KB
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()
);

注意

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

许可证

在以下许可证中选择一个

任选其一。

贡献

除非您明确声明,否则您提交的任何旨在包含在作品中的贡献,根据Apache-2.0许可证的定义,将根据上述条款双许可,不附加任何额外条款或条件。

依赖关系

~3MB
~37K SLoC