1 个不稳定版本
0.0.0 | 2022 年 5 月 28 日 |
---|
#38 在 #incomplete
180KB
4.5K SLoC
jsonata-rust
请勿在生产环境中使用此版本,它可能在未实现的功能中出现意外崩溃,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 License,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确声明,否则你提交给工作的任何有意包含的贡献,如 Apache-2.0 许可证中定义的,将根据上述条款双许可,不附加任何其他条款或条件。
依赖关系
~5.5MB
~86K SLoC