如何合并两条JSONPath查询为单条,实现指定HEADER_ID的跨层级数据提取
合并两条JSONPath查询的实现方案
你可以直接利用jsonpath_ng.ext支持的并集运算符或者递归下降匹配,将两条查询合并为单条,不需要做二次判断。
最优合并方案(推荐:递归下降写法更简洁)
直接用递归下降符号$..匹配任意层级下符合过滤条件的HEADER节点,自动覆盖顶层HEADERS和嵌套SUB_HEADERS两种场景:
from jsonpath_ng.ext import parse # 合并后的单条JSONPath查询 jsonpath_expression = parse(f'$..[?(@.HEADER_ID=={mapping_id} && @.HEADER_IXML_PARAID != "")]["HEADER_IXML_PARAID","SECTION_TEXT_PARAID_LIST"]') match = jsonpath_expression.find(self.tagged_sections)
备选方案(显式并集写法,兼容性更强)
如果担心递归下降匹配到其他无关节点,可以用|并集运算符显式拼接两条原有路径:
from jsonpath_ng.ext import parse jsonpath_expression = parse(f'(HEADERS[?(@.HEADER_ID=={mapping_id} && @.HEADER_IXML_PARAID != "")] | HEADERS[*].SUB_HEADERS[?(@.HEADER_ID=={mapping_id} && @.HEADER_IXML_PARAID != "")])["HEADER_IXML_PARAID","SECTION_TEXT_PARAID_LIST"]') match = jsonpath_expression.find(self.tagged_sections)
效果验证
两种写法都可以覆盖你给出的测试场景:
- 当
mapping_id=1.1时,会匹配到嵌套在SUB_HEADERS下的对应节点,返回HEADER_IXML_PARAID值0A863DE3和SECTION_TEXT_PARAID_LIST数组["4E01355B","132F90DD"] - 当
mapping_id=2时,会匹配到顶层HEADERS下的对应节点,返回对应字段值
内容的提问来源于stack exchange,提问作者Aanchal Agarwal
相关产品推荐
相关产品推荐

