2 个版本

0.1.1 2023 年 5 月 19 日
0.1.0 2023 年 5 月 19 日

#13 in #社区

Apache-2.0GPL-3.0-only

270KB
6K SLoC

JMESPath Community 是 JMESPath 的社区实现,JMESPath 是一种用于 JSON 的查询和转换语言。

评估 JMESPath 表达式

使用 search 函数来评估 JMESPath 表达式。

示例

use jmespath_community as jmespath;
use jmespath::{search, Value};

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

et result = search("foo.bar | baz", &data).unwrap();
ssert_eq!(true, result);

可以使用 parse 函数解析一次 JMESPath 表达式并多次评估。

示例

use jmespath_community as jmespath;
use jmespath::{parse, Value};

let ast = parse("foo").unwrap();
let data = Value::from_json(r#"{"foo": "bar"}"#).unwrap();
let result = ast.search(&data).unwrap();
assert_eq!("bar", result);

注册自定义函数

JMESPath Community 提供了许多有用的 内置函数。然而,它可以通过 第三方函数 进行扩展。

示例

mod custom_functions {

	use jmespath_community as jmespath;

    use jmespath::function;

    use jmespath::errors::Error as RuntimeError;

    use jmespath::FunctionContext;
    use jmespath::Value;

    use jmespath::functions::ReturnValue;
    use jmespath::functions::Function;

    use jmespath::functions::DataType;
    use jmespath::functions::ParamTypes::*;
    use jmespath::functions::Parameter;
    use jmespath::functions::Parameter::*;

    function!(
        add,
        [
            left => Required(Of(DataType::Number)),
            right => Required(Of(DataType::Number))
        ],
        arguments,
        {
            // type checking has been performed by the runtime
            // safe to unwrap

            let i = arguments[0].as_f64().unwrap();
            let j = arguments[1].as_f64().unwrap();

            Value::from_f64(i + j)
        }
    );
}

创建 JMESPath Runtime 对象的新实例并注册您的自定义函数

示例

use jmespath_community as jmespath;
use jmespath::FunctionRegistrar;
use jmespath::{Runtime, Value};

let add = Box::new(custom_functions::add::new());
let mut runtime = Runtime::create_runtime();
runtime.register(add);

let expression = "foo";
let root = Value::Null;
let result = runtime.search(expression, &root).unwrap();

assert_eq!(None, result);

依赖

~4.5–6.5MB
~113K SLoC