使用jsonpath_ng对比带与不带通配符的JSONPath的实现方法
基于jsonpath_ng的JSONPath匹配判断实现
核心思路
不需要手动解析JSONPath语法规则,直接利用jsonpath_ng的原生赋值、匹配能力实现通用校验:
- 构造仅包含「精确JSONPath」对应节点的最小模拟JSON结构
- 用待校验的「带通配符的JSONPath」匹配该模拟结构
- 匹配结果非空则说明精确路径指向的节点会被通配符路径命中
该方案天然兼容jsonpath_ng支持的所有JSONPath特性(包括切片、属性过滤器、多层通配符**等),不需要手动适配新语法。
代码实现
from jsonpath_ng import parse def is_exact_path_matched_by_wildcard(exact_path: str, wildcard_path: str) -> bool: # 解析两个JSONPath try: exact_expr = parse(exact_path) wildcard_expr = parse(wildcard_path) except Exception as e: # JSONPath格式非法时可根据业务需要处理异常 raise ValueError(f"JSONPath格式错误: {str(e)}") # 构造仅包含精确路径节点的最小JSON对象 mock_json = {} # 给精确路径的节点赋值任意非空值(此处用True做标识) exact_expr.update_or_create(mock_json, True) # 用通配符路径匹配模拟对象 match_result = wildcard_expr.find(mock_json) # 匹配结果非空则说明命中 return len(match_result) > 0
测试示例
# 业务场景示例 exact_path = "$.top.middle[0].bottom[0].START" wildcard_path = "$.top.middle[*].bottom[*].START" print(is_exact_path_matched_by_wildcard(exact_path, wildcard_path)) # 输出: True
注意事项
输入的exact_path需要是无通配符的精确路径,否则构造模拟JSON对象时可能生成多余节点,导致校验结果不符合预期。
内容的提问来源于stack exchange,提问作者James Bradbury
相关产品推荐
相关产品推荐

