1 个不稳定版本

0.0.0 2022 年 5 月 28 日

#38#incomplete

MIT/Apache

180KB
4.5K SLoC

jsonata-rust

github crates.io docs.rs test status

请勿在生产环境中使用此版本,它可能在未实现的功能中出现意外崩溃,API 用户体验不佳且变化快,文档不完整。此版本已发布到 crates.io,以便感兴趣的人可以轻松地开始尝试。

Rust 中 JSONata 的(不完整)实现。

什么是 JSONata?

来自 JSONata 网站

  • 轻量级的 JSON 数据查询和转换语言
  • 灵感来自 XPath 3.1 的位置路径语义
  • 具有最小语法的复杂查询表达式
  • 内置操作符和函数,用于操作和组合数据
  • 创建用户自定义函数
  • 将查询结果格式化为任何 JSON 输出结构

阅读 完整文档,并在 练习环境 中尝试。

入门

API 当前用户体验不佳,因为您需要提供一个 bumpalo 区域用于分配值。

首先,将以下内容添加到您的 Cargo.toml

[dependencies]
jsonata = "0"
bumpalo = "3.9.1"

然后您可以用如下方式评估一个表达式

use bumpalo::Bump;
use jsonata::JsonAta;

fn main() {
    // Create an arena for allocating values, this will go away in future except for advanced use cases
    let arena = Bump::new();

    // Provide some JSON input, this could be read from a file or come from the network
    let input = "{ \"name\": \"world\" }";

    // The JSONata expression to evaluate
    let expr = "\"Hello, \" & name & \"!\"";

    // Parse the expression - this could fail
    let jsonata = JsonAta::new(expr, &arena).unwrap();

    // Evaluate the expression against the input - this could fail
    let result = jsonata.evaluate(Some(input)).unwrap();

    // Serialize the result into JSON
    println!("{}", result.serialize(false));
}

还有一个基本的 CLI 工具

# cargo install jsonata

# jsonata "1 + 1"
2

# jsonata '"Hello, " & name & "!"' '{ "name": "world" }'
"Hello, world!"

表达式和输入可以指定在命令行上,但需要手动转义。或者,它们可以从文件中提供。以下是 --help 输出

# jsonata --help
jsonata 0.0.0
A command line JSON processor using JSONata

USAGE:
    jsonata [FLAGS] [OPTIONS] [ARGS]

FLAGS:
    -a, --ast        Parse the given expression, print the AST and exit
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -e, --expr-file <expr-file>      File containing the JSONata expression to evaluate (overrides expr on command line)
    -i, --input-file <input-file>    Input JSON file (if not specified, STDIN)

ARGS:
    <expr>     JSONata expression to evaluate
    <input>    JSON input

缺失(但计划)的功能

有许多 JSONata 功能尚未实现

  • 许多内置函数缺失
  • 父操作符
  • 上下文和索引绑定变量
  • 正则表达式
  • 对象转换
  • 排序
  • 部分函数应用
  • 将 JSON AST 输出与参考实现匹配

与参考 JSONata 的差异

不支持函数签名

函数签名有它们的问题,如 此处 所述,此实现不支持。

然而,大多数 JSONata 函数都支持将上下文作为第一个参数传递,如它们的签名所要求的,例如

["Hello", "world"].$substring(1, 2)

/* Output: ["el", "or"] */

这实现在每个内置函数本身中。例如,如果 $string 发现它是没有参数被调用的,它将使用当前上下文。

此外,对于所有内置函数,参数的类型检查也是直接在函数本身中实现的,这样你就可以得到与参考 JSONata 相同的运行时错误。

状态

有一个状态文档,其中描述了该实现的当前状态和长期目标。

测试

参考 JSONata 包含了一个包含超过1000个测试的测试套件。目前,这个实现通过了其中的600多个,你可以这样运行它们

cargo test testsuite

tests/testsuite/groups 中是通过的测试组,而 tests/testsuite/skip 包含了仍需要功能实现的组。剩余的组中可能也有通过测试的测试,但我不想将它们分开 - 只有当一个测试组完全通过时,它才会被移动。

许可证

根据以下任一项许可

任选其一。

贡献

除非你明确声明,否则你提交给工作的任何有意包含的贡献,如 Apache-2.0 许可证中定义的,将根据上述条款双许可,不附加任何其他条款或条件。

依赖关系

~5.5MB
~86K SLoC