#serde-json #json #json-query #serde #query

access-json

使用 serde 在 Rust 中查询大型嵌套结构。低功耗,只读 FFI。

1 个不稳定版本

0.1.0 2020 年 5 月 6 日

#1170Rust 模式

Download history 1703/week @ 2023-11-27 1553/week @ 2023-12-04 1537/week @ 2023-12-11 1252/week @ 2023-12-18 414/week @ 2023-12-25 1130/week @ 2024-01-01 1667/week @ 2024-01-08 1541/week @ 2024-01-15 1973/week @ 2024-01-22 1672/week @ 2024-01-29 1496/week @ 2024-02-05 1298/week @ 2024-02-12 1497/week @ 2024-02-19 1216/week @ 2024-02-26 1377/week @ 2024-03-04 395/week @ 2024-03-11

4,524 每月下载量
7 个crate中使用(直接使用4个)

MIT/Apache

46KB
1K SLoC

access-json Rust

利用 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