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
相关产品推荐
相关产品推荐

