#json #jq #json-query #query #api-bindings

jq-rs

运行jq程序以从json字符串中提取数据

3个不稳定版本

0.4.1 2019年8月17日
0.4.0 2019年7月7日
0.0.0-alpha2019年6月28日

#1380 in 解析器实现

Download history 173/week @ 2024-04-01 78/week @ 2024-04-08 93/week @ 2024-04-15 90/week @ 2024-04-22 82/week @ 2024-04-29 72/week @ 2024-05-06 85/week @ 2024-05-13 100/week @ 2024-05-20 80/week @ 2024-05-27 115/week @ 2024-06-03 72/week @ 2024-06-10 86/week @ 2024-06-17 107/week @ 2024-06-24 46/week @ 2024-07-01 86/week @ 2024-07-08 91/week @ 2024-07-15

每月339次下载
6 个crate中使用了(5个直接使用)

Apache-2.0/MIT

33KB
434

jq-rs

crates.io crates.io docs.rs Build Status

概述

在v0.4.0之前,这个crate名为json-query

此Rust crate通过libjq C API(而不是“外壳”)提供对jq 1.6的访问。

通过利用jq,我们可以使用jq的dsl从json字符串中提取数据。

此crate需要Rust 1.32 或更高版本。

用法

此crate提供的基本接口。您提供jq程序字符串和要运行程序的字符串。

use jq_rs;
// ...

let res = jq_rs::run(".name", r#"{"name": "test"}"#);
assert_eq!(res.unwrap(), "\"test\"\n".to_string());

除了使用jq_rs::run()运行一次性程序外,您还可以使用jq_rs::compile()编译jq程序并使用不同的输入重用它。

use jq_rs;

let tv_shows = r#"[
 {"title": "Twilight Zone"},
 {"title": "X-Files"},
 {"title": "The Outer Limits"}
]"#;

let movies = r#"[
 {"title": "The Omen"},
 {"title": "Amityville Horror"},
 {"title": "The Thing"}
]"#;

let mut program = jq_rs::compile("[.[].title] | sort").unwrap();

assert_eq!(
 &program.run(tv_shows).unwrap(),
 "[\"The Outer Limits\",\"Twilight Zone\",\"X-Files\"]\n"
);

assert_eq!(
 &program.run(movies).unwrap(),
 "[\"Amityville Horror\",\"The Omen\",\"The Thing\"]\n",
);

关于性能的说明

虽然这些基准测试远非详尽无遗,但它们表明简单的jq程序的大部分运行时间都花在编译上。事实上,编译是非常昂贵的。

run one off             time:   [48.594 ms 48.689 ms 48.800 ms]
Found 6 outliers among 100 measurements (6.00%)
3 (3.00%) high mild
3 (3.00%) high severe

run pre-compiled        time:   [4.0351 us 4.0708 us 4.1223 us]
Found 15 outliers among 100 measurements (15.00%)
6 (6.00%) high mild
9 (9.00%) high severe

如果您需要多次运行相同的jq程序,强烈建议保留预编译的JqProgram并重用它。

处理输出

由于输出不一定是有效的json,jq的返回值是字符串。因此,如果您想处理表示的实际数据类型,则需要解析输出。

在这种情况下,您可能希望与此crate搭配使用serde_json或类似库。

例如,我们想从这个对象的集合中提取数字

use jq_rs;
use serde_json::{self, json};

// ...

let data = json!({
 "movies": [
     { "title": "Coraline", "year": 2009 },
     { "title": "ParaNorman", "year": 2012 },
     { "title": "Boxtrolls", "year": 2014 },
     { "title": "Kubo and the Two Strings", "year": 2016 },
     { "title": "Missing Link", "year": 2019 }
 ]
});

let query = "[.movies[].year]";
// program output as a json string...
let output = jq_rs::run(query, &data.to_string()).unwrap();
// ... parse via serde
let parsed: Vec<i64> = serde_json::from_str(&output).unwrap();

assert_eq!(vec![2009, 2012, 2014, 2016, 2019], parsed);

目前从jq cli提供的选项或标志非常有限。实际上,唯一提供的是在json块上执行jq程序的能力。请原谅我在整理细节时的混乱。

链接到libjq

此crate根据您的选择,在构建和/或运行时需要访问libjq

当启用默认关闭bundled 功能时,libjq 会通过 jq-sysjq-src 静态链接到您的包中。使用此功能需要确保在 PATH 中有 autotools 和 gcc,以便构建工作。

如果没有启用 bundled 功能,您需要确保您的包可以链接到 libjq 以便绑定工作。

您可以自己编译 libjq,或者可能通过您系统的包管理器安装它。有关如何与 jq-sys 包共享如何链接的提示的详细信息,请参阅jq-sys 构建文档

更新日志

v0.4.1 (2019-08-17)

新增功能

  • std::error::Error + Send + 'static 实现 jq_rs::Error,以便更好地与流行的错误处理包 error-chain 和其他包集成 (#22)。

v0.4.0 (2019-07-06)

重大变更

  • 将包重命名为 json-queryjq-rs (#12)。
  • 采用 2018 版本。现在最低支持的 Rust 版本是 1.32 (#14)。
  • jq 程序的输出现在包含一个尾随换行符,就像 jq 二进制文件的输出一样 (#6)。
  • 添加了自定义的 ErrorResult 类型,这些类型来自此包中的易出错的函数和方法 (#8)。

v0.3.1 (2019-07-04)

注意:这是以 json-query 命名的最终版本。未来的版本将作为 jq-rs 发布。

错误修复

  • 修复了输出中的换行符未正确保留的问题 (#3)。
  • 解决了一个内存错误,这可能导致运行 jq 程序时崩溃,该程序可能尝试访问对象中缺失的字段 (#4)。
  • 修复了一些在处理过程中可能发生的内存泄漏 (#10)。

v0.3.0 (2019-06-01)

  • 添加了 json_query::compile()。编译 jq 程序,然后重用它,对多个输入运行它。

v0.2.1 (2019-06-01)

  • #1 在 docs.rs 上构建时启用了 bundled 功能。

v0.2.0 (2019-02-18)

  • jq-sys 依赖更新到 v0.2.0,以获得更好的构建控制。
  • 目前采用 2015 版本风格的导入。

重大变更

  • bundled 功能不再默认启用。

v0.1.1 (2019-01-14)

  • 添加了额外的 cargo 清单链接。
  • 添加了一些基本文档。
  • 添加了一个bundled功能,可以选择是否使用捆绑源。

v0.1.0(2019-01-13)

初始版本。

依赖项

~1MB
~23K SLoC