6 个版本

0.1.5 2023 年 6 月 12 日
0.1.4 2023 年 6 月 12 日

#7 in #scalar

34 每月下载量
用于 json_path_bin

MIT/Apache

73KB
2K SLoC

jsonpath-rs

Crates.io docs.rs Rust CI

A Rust 实现 JsonPath.

为什么

  1. 根据用户查询返回正确的结果类型(标量 vs. 数组)
  2. 支持丰富的过滤器和方法(进行中),例如 [?((@.id > 10 || @.id < -1) && @.msg contains 'jsonpath')]

使用库

use json_path::JsonPathQuery;
use serde_json::json;

let object = json!({"greetings": "hello, json_path"});
let result = object.query("$['greetings']");
assert_eq!(Ok(json!("hello, json_path")), result);

使用二进制文件

$ cargo install json_path_bin
$ echo '{"msg": "hello!"}' | json_path_bin -j '$.msg'
"hello!"
$

功能

运算符

运算符 描述
$ 查询的根元素。所有路径表达式从这里开始。
@ 过滤器谓词正在处理的当前节点。
* 通配符。在需要名称或数字的任何地方都可用。
.. 深度扫描。在需要名称的任何地方都可用。
.<名称> 点表示的子元素
['<名称>' (, '<名称>')] 方括号表示的子元素或子元素集合
[<数字> (, <数字>)] 数组索引或索引集合
[开始:结束] 数组切片运算符
[?(<表达式>)] 过滤器表达式。表达式必须评估为布尔值。
  1. 可以使用负数作为数组索引或数组切片。它表示评估器从数组的末尾访问项。
  2. 数组切片可以支持类似以下的概念
    • [1:] 从索引 1(包含)到末尾的切片
    • [:-1] 从开始到最后一个元素(排除)的切片
    • [1:10] 从 1(包含)到 10(排除)的切片

过滤器

运算符 描述
== 左边等于右边(注意 1 不等于 '1')
!= 左边不等于右边
< 左边小于右边
<= 左边小于或等于右边
> 左边大于右边
>= 左边大于或等于右边
=~ 工作进行中,左侧匹配正则表达式 [?(@.name =~ /foo.*?/i)]
! 用于否定过滤器:[?([email protected])] 匹配没有 isbn 属性的项目。
in 左侧存在于右侧 [?(@.size in ['S', 'M'])]
nin 左侧不存在于右侧
subsetof 左侧是右侧的子集 [?(@.sizes subsetof ['S', 'M', 'L'])]
contains 检查字符串是否包含指定的子串(区分大小写),或者数组是否包含指定的元素
anyof 左侧与右侧有交集 [?(@.sizes anyof ['M', 'L'])]
noneof 左侧与右侧无交集 [?(@.sizes noneof ['M', 'L'])]
size 左侧(数组或字符串)的大小应与右侧匹配
empty 左侧(数组或字符串)应为空,例如:[?(@.name empty false)]
(<expressions>) 使用括号分组表达式,例如:[?(!(@.sizes contains 'M'))]

类似项目

依赖项

~0.4–0.8MB
~18K SLoC