1 个不稳定版本
0.1.0 | 2020 年 5 月 6 日 |
---|
#1170 在 Rust 模式
4,524 每月下载量
在 7 个crate中使用(直接使用4个)
46KB
1K SLoC
access-json
利用 serde 在 Rust 中查询大型嵌套结构。低功耗,只读 FFI。
查询 Serde-Serializable 数据的子集
此库允许您对任何 serde-serializable 对象执行简单的路径查询;将结果作为 Option<serde_json::Value>
返回。
use access_json::JSONQuery;
use std::collections::HashMap;
use serde_json;
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 = serde_json::to_value(&9)?; // You must derive Serialize!
assert_eq!(Some(expected), output);
一个更复杂的嵌套示例
use access_json::JSONQuery;
use serde_json::{self, Value};
let data: Value = serde_json::from_str(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 = serde_json::to_value(&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 = serde_json::to_value(&vec![3,2,1])?;
assert_eq!(Some(expected), output);
只需 #[derive(Serialize)]
即可查询任何结构体或枚举
use access_json::JSONQuery;
#[macro_use]
extern crate serde_derive;
#[derive(Serialize)]
struct Dog {
name: String,
age: i32,
favorites: Vec<String>,
}
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);
依赖关系
~0.8–1.6MB
~36K SLoC