You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jayway JsonPath谓词过滤问题:筛选含指定ID用户的shareables

Jayway JsonPath 筛选包含指定ID用户的shareables方案

嘿,刚好我对Jayway JsonPath的过滤用法比较熟,这就帮你解决这个问题!

首先明确你的需求:要找出所有层级(包括顶层和嵌套在dataset里的)包含指定ID用户的shareables节点,对吧?下面分两种场景给你对应的路径写法:

1. 递归查找所有层级的shareables(含嵌套在dataset里的)

用这个路径就能搞定:

$..shareables[?(@.users.any(it => it.id == '你的目标ID'))]

各部分解释:

  • $..shareables:..是递归遍历符号,会匹配JSON中所有层级的shareables节点,不管它在顶层还是嵌套在dataset里
  • [?(...)]:这是JsonPath的过滤表达式,只保留满足括号内条件的节点
  • @.users.any(it => it.id == '你的目标ID'):@代表当前遍历到的shareables节点,any()是Jayway提供的数组方法,用来检查users数组中是否存在任意一个元素(用it指代)的id等于你指定的目标ID

2. 只筛选顶层的shareables

如果不需要嵌套的,只找最顶层的shareables,把路径改成:

$.shareables[?(@.users.any(it => it.id == '你的目标ID'))]

把$..换成$.就只会匹配根节点下的shareables数组。

注意事项

  • 如果你的目标ID是数字类型(不是字符串),记得去掉引号,比如写成it.id == 123
  • 确保你的Jayway版本是较新的,旧版本可能不支持Lambda表达式(it => ...这种写法),如果遇到兼容性问题,可以用替代写法(不过这个兼容性写法准确性稍差,仅当users数组中只有一个id时可靠):
    $..shareables[?(@.users[*].id == '你的目标ID')]
    

举个实际例子,假设你的JSON结构是这样:

{
  "shareables": [
    {
      "users": [{"id": "123", "name": "Alice"}],
      "dataset": {}
    },
    {
      "users": [{"id": "456", "name": "Bob"}],
      "dataset": {
        "shareables": [
          {
            "users": [{"id": "123", "name": "Alice"}],
            "dataset": {}
          }
        ]
      }
    }
  ]
}

当你用$..shareables[?(@.users.any(it => it.id == '123'))]时,会返回两个shareables节点:顶层第一个,以及嵌套在dataset里的那个。

内容的提问来源于stack exchange,提问作者Wookimonsta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:10:15