5 个版本 (3 个重大更新)

0.3.0 2022年2月24日
0.2.0 2017年8月26日
0.1.1 2017年1月8日
0.1.0 2016年12月16日
0.0.1 2016年1月31日

#321数据库接口

Download history 13377/week @ 2024-03-14 12709/week @ 2024-03-21 8895/week @ 2024-03-28 14131/week @ 2024-04-04 12711/week @ 2024-04-11 15384/week @ 2024-04-18 14943/week @ 2024-04-25 12974/week @ 2024-05-02 14680/week @ 2024-05-09 16953/week @ 2024-05-16 17899/week @ 2024-05-23 20255/week @ 2024-05-30 15015/week @ 2024-06-06 14168/week @ 2024-06-13 17035/week @ 2024-06-20 15141/week @ 2024-06-27

65,336 每月下载量
用于 15 库(8 个直接使用)

MIT 许可证

165KB
4K SLoC

Rust语言的JMESPath实现,用于JSON查询语言。

编译JMESPath表达式

使用 jmespath::compile 函数将 JMESPath 表达式编译成可重用的 Expression 结构体。该结构体可以用于多次编译表达式而无需重新编译。

use jmespath;

let expr = jmespath::compile("foo.bar | baz").unwrap();

// Parse some JSON data into a JMESPath variable
let json_str = "{\"foo\":{\"bar\":{\"baz\":true}}}";
let data = jmespath::Variable::from_json(json_str).unwrap();

// Search the data with the compiled expression
let result = expr.search(data).unwrap();
assert_eq!(true, result.as_boolean().unwrap());

您可以从 Expression 结构体中获取原始表达式作为字符串和解析后的表达式抽象语法树(AST)。

use jmespath;
use jmespath::ast::Ast;

let expr = jmespath::compile("foo").unwrap();
assert_eq!("foo", expr.as_str());
assert_eq!(&Ast::Field {name: "foo".to_string(), offset: 0}, expr.as_ast());

JMESPath 变量

为了对已知数据类型进行表达式评估,使用 jmespath::Variable 枚举作为输入和输出类型。更具体地说,使用 Rcvar(或 jmespath::Rcvar)允许在运行时由 JMESPath 解释器使用共享、引用计数的共享数据。

默认情况下,Rcvar 是一个 std::rc::Rc<Variable>。但是,通过指定 sync 功能,您可以使用 std::sync::Arc<Variable> 来在多线程间共享 Expression 结构体。

任何实现了 jmespath::ToJmespath 的类型都可以用于 JMESPath 表达式。各种类型都有默认的 ToJmespath 实现,包括 serde::ser::Serialize。因为 jmespath::Variable 实现了 serde::ser::Serialize,许多现有类型可以在不需要显式强制转换的情况下进行搜索,并且任何需要强制转换的类型都可以使用 serde 的宏或代码生成功能来实现。这包括许多常用类型,例如 serde 的 serde_json::Value 枚举。

使用 JMESPath 搜索数据的返回值也是一个 RcvarVariable 有许多辅助方法,使其成为一个可以直接使用的数据类型,或者您可以将 Variable 转换为任何实现 serde::de::Deserialize 的 serde 值。

自定义函数

您可以通过使用自定义的 Runtime 将自定义函数与 JMESPath 表达式注册。当您调用 jmespath::compile 时,您正在使用一个共享的 Runtime 实例,它通过 lazy_static 惰性创建。默认情况下,这个共享的 Runtime 利用所有内置的 JMESPath 函数。但是,可以通过创建一个自定义的 Runtime 并直接从 Runtime 编译表达式来使用自定义函数。

use jmespath::{Runtime, Context, Rcvar};
use jmespath::functions::{CustomFunction, Signature, ArgumentType};

// Create a new Runtime and register the builtin JMESPath functions.
let mut runtime = Runtime::new();
runtime.register_builtin_functions();

// Create an identity string function that returns string values as-is.
runtime.register_function("str_identity", Box::new(CustomFunction::new(
    Signature::new(vec![ArgumentType::String], None),
    Box::new(|args: &[Rcvar], _: &mut Context| Ok(args[0].clone()))
)));

// You can also use normal closures as functions.
runtime.register_function("identity",
    Box::new(|args: &[Rcvar], _: &mut Context| Ok(args[0].clone())));

let expr = runtime.compile("str_identity('foo')").unwrap();
assert_eq!("foo", expr.search(()).unwrap().as_string().unwrap());

let expr = runtime.compile("identity('bar')").unwrap();
assert_eq!("bar", expr.search(()).unwrap().as_string().unwrap());

依赖关系

~360–790KB
~17K SLoC