#json #jq #json-parser #api-bindings

json-query

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

6个版本

使用旧的Rust 2015

0.3.1 2019年7月5日
0.3.0 2019年6月2日
0.2.1 2019年6月2日
0.2.0 2019年2月19日
0.1.1 2019年1月14日

#1018 in Rust模式


automaat-processor-json-e… 中使用

Apache-2.0/MIT

27KB
389

json-query

crates.io crates.io docs.rs

注意

版本0.3.1标志着json-query的终结。 未来的版本将以新的名称jq-rs发布。

此Rust包通过其C API提供对jq 1.6的编程访问。

通过利用jq,我们可以使用jq的过滤DSL从json字符串中提取和转换数据。

use json_query;
// ...

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

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

use json_query;

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 = json_query::compile("[.[].title] | sort").unwrap();

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

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

运行方法的返回值是json字符串,因此如果您想处理表示的实际数据类型,则需要解析它。因此,您可能希望将此库与serde_json或类似的库一起使用。

例如,我们想从一组对象中提取数字

use json_query;
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 = json_query::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

当启用bundled功能(默认为关闭)时,libjqjq-sysjq-src提供并静态链接,这些需要PATH中的autotools和gcc来构建。

如果您禁用了bundled功能,则需要确保您的crate链接到libjq,以便绑定正常工作。

有关如何与jq-syscrate共享链接提示的详细信息,请参阅jq-sys构建文档

请注意,在启用或禁用bundled之间切换构建时,可能需要执行cargo clean

我无法解释,但如果您不清理输出目录,有时捆绑构建会中断。

更新日志

v0.3.1 (2019-06-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 功能,用于选择是否使用捆绑源。

0.1.0 (2019-01-13)

初始版本。

依赖关系

~1MB
~23K SLoC