使用jsonpath-ng筛选level1层级levelName字段返回空的问题咨询
问题原因
你的查询表达式存在两个核心问题:
- 没有显式使用
@指代当前筛选的数组元素,jsonpath-ng在无明确当前节点引用时,会默认从当前节点的子级开始递归查找属性。你之前能命中childName属于递归查找的巧合:childName是当前元素的子对象child下的属性,递归可以查到;而查询levelName时,递归会优先查找子级属性,找不到匹配就返回空结果。 - 多余的解引用层级:
$.data.level1[*]已经将数组展开为单个元素,不需要额外追加一层方括号触发属性查找,直接把过滤条件写在数组的筛选块中即可。
正确表达式
查询level1层级下levelName值为level11的条目,使用以下表达式即可:$.data.level1[?(@.levelName == 'level11')]
如果需要查询childName为first的条目,也建议显式指定路径,避免递归查找带来的不确定性:$.data.level1[?(@.child.childName == 'first')]
验证示例(Python + jsonpath-ng)
from jsonpath_ng import parse # 示例数据 test_data = { "data": { "level1": [ { "levelName": "level11", "cost": 1, "child": {"childName": "first", "status": "running"} }, { "levelName": "level12", "cost": 2, "child": {"childName": "second", "status": "asleep"} } ] } } # 执行查询 query_expr = parse("$.data.level1[?(@.levelName == 'level11')]") result = [item.value for item in query_expr.find(test_data)] print(result) # 输出:[{'levelName': 'level11', 'cost': 1, 'child': {'childName': 'first', 'status': 'running'}}]
内容的提问来源于stack exchange,提问作者rastackr
相关产品推荐
相关产品推荐

