Hijack serde to query large nested structures in Rust. For low-effort, read-only FFI.
This library allows you to execute a simple path-query against any serde-serializable object; returning the result as a Option<serde_json::Value>
.
```rust use accessjson::JSONQuery; use std::collections::HashMap; use serdejson;
let mut data: HashMap<&str, u32> = HashMap::default(); data.insert("cat", 9);
let query = JSONQuery::parse(".cat")?; // QueryParseErr let output = query.execute(&data)?; // QueryExecErr let expected = serdejson::tovalue(&9)?; // You must derive Serialize!
assert_eq!(Some(expected), output); ```
## A More Complex, Nested Example
```rust use accessjson::JSONQuery; use serdejson::{self, Value};
let data: Value = serdejson::fromstr(r#"{ "items": [ { "unwanted": 7, "wanted": {"x": 3, "y": 7}, "array": [3,2,1] }, { "whatever": true } ] }"#)?;
// We can reference dictionary fields and array indices together: let output = JSONQuery::parse(".items[1].whatever")?.execute(&data)?; let expected = serdejson::tovalue(&true)?; assert_eq!(Some(expected), output);
// We can have results be of any-size sub-tree, e.g., a whole array or vec. let output = JSONQuery::parse(".items[0].array")?.execute(&data)?; let expected = serdejson::tovalue(&vec![3,2,1])?; assert_eq!(Some(expected), output); ```
## Just #[derive(Serialize)]
to query any struct or enum:
```rust use accessjson::JSONQuery; #[macrouse] extern crate serde_derive;
#[derive(Serialize)]
struct Dog {
name: String,
age: i32,
favorites: Vec
let data = Dog { name: "Buddy".into(), age: 14, favorites: vec!["walks".into(), "naps".into()], };
let found = JSONQuery::parse(".name")?.execute(&data)?.unwrap(); assert_eq!("Buddy", found); ```