Crates.io | json-query |
lib.rs | json-query |
version | 0.3.1 |
source | src |
created_at | 2019-01-13 21:07:26.57873 |
updated_at | 2019-07-05 05:16:15.219919 |
description | Run jq programs to extract data from json strings. |
homepage | https://github.com/onelson/json-query |
repository | https://github.com/onelson/json-query |
max_upload_size | |
id | 108376 |
size | 28,135 |
Notice
Release 0.3.1 marks the end of the line for
json-query
. Future releases will be published under the new name of jq-rs.
This rust crate provides programmatic access to jq 1.6 via its C api.
By leveraging jq we can extract and transform data from a json string using jq's filtering dsl.
use json_query;
// ...
let res = json_query::run(".name", r#"{"name": "test"}"#);
assert_eq!(res, Ok("\"test\"".to_string()));
In addition to running one-off programs with json_query::run()
, you can also
use json_query::compile()
to compile a jq program and reuse it with
different inputs.
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()
);
The return values from the run methods are json strings, and as such will need to be parsed if you want to work with the actual data types being represented. As such, you may want to pair this crate with serde_json or similar.
For example, here we want to extract the numbers from a set of objects:
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);
Barely any of the options or flags available from the jq cli are exposed currently. Literally all that is provided is the ability to execute a jq program on a blob of json. Please pardon my dust as I sort out the details.
When the bundled
feature is enabled (off by default) libjq
is provided and
linked statically by jq-sys and jq-src
which require having autotools and gcc in PATH
to build.
If you disable the bundled
feature, you will need to ensure your crate
links to libjq
in order for the bindings to work.
See the jq-sys building docs for details on how to share hints with the jq-sys crate on how to link.
Note that it may be required to
cargo clean
when switching between building withbundled
enabled or disabled.I can't explain it, but sometimes the
bundled
build will break if you don't give the out dir a good scrubbing.
Note: This is final release with the name json-query
.
Future releases will be published as jq-rs.
Bugfixes
json_query::compile()
. Compile a jq program, then reuse it, running
it against several inputs.bundled
feature when building on docs.rs.Breaking Changes:
bundled
feature is no longer enabled by default.
bundled
feature to opt in or out of using the bundled source.Initial release.