3个不稳定版本
0.4.1 | 2019年8月17日 |
---|---|
0.4.0 | 2019年7月7日 |
0.0.0-alpha | 2019年6月28日 |
#1380 in 解析器实现
每月339次下载
在 6 个crate中使用了(5个直接使用)
33KB
434 行
jq-rs
概述
在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-sys 和 jq-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-query
为jq-rs
(#12)。 - 采用 2018 版本。现在最低支持的 Rust 版本是 1.32 (#14)。
- jq 程序的输出现在包含一个尾随换行符,就像
jq
二进制文件的输出一样 (#6)。 - 添加了自定义的
Error
和Result
类型,这些类型来自此包中的易出错的函数和方法 (#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