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 在 数据库接口
65,336 每月下载量
用于 15 个 库(8 个直接使用)
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 搜索数据的返回值也是一个 Rcvar
。 Variable
有许多辅助方法,使其成为一个可以直接使用的数据类型,或者您可以将 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