组合两个JSONPath查询

2024-09-23 22:29:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将以下JSONPath查询组合成一个查询

mapping_id = 1.1

jsonpath_expression = parse(f'HEADERS[*].SUB_HEADERS[?(@.HEADER_ID=={mapping_id}) & (@.HEADER_IXML_PARAID != "")].HEADER_IXML_PARAID, SECTION_TEXT_PARAID_LIST')

jsonpath_expression = parse(f'HEADERS[?(@.HEADER_ID=={mapping_id}) & (@.HEADER_IXML_PARAID != "")].HEADER_IXML_PARAID, SECTION_TEXT_PARAID_LIST')

以下是我需要从中获取信息的JSON格式:

{
    "HEADERS": [
        {
            "HEADER_ID": 1,
            "HEADER_NAME": "HEADING 1 TEXT",
            "HEADER_IXML_PARAID": "116BACE8",
            "SECTION_TEXT_PARAID_LIST": [],
            "SUB_HEADERS": [
                {
                    "HEADER_ID": 1.1,
                    "HEADER_NAME": "Therapeutic indications",
                    "HEADER_IXML_PARAID": "0A863DE3",
                    "SECTION_TEXT_PARAID_LIST": [
                        "4E01355B",
                        "132F90DD"
                    ],
                    "SUB_HEADERS": []
                }],
        },
        {
            "HEADER_ID": 2,
            "HEADER_NAME": "HEADING 2 TEXT",
            "HEADER_IXML_PARAID": "116BACE8",
            "SECTION_TEXT_PARAID_LIST": [],
            "SUB_HEADERS": []
        }
    ]
}

现在,这是我正在使用的方法,但我更愿意将两者结合起来

from jsonpath_ng.ext import parse

jsonpath_expression = parse(f'HEADERS[?(@.HEADER_ID=={mapping_id}) & (@.HEADER_IXML_PARAID != "")].HEADER_IXML_PARAID, SECTION_TEXT_PARAID_LIST')
match = jsonpath_expression.find(self.tagged_sections)
if not match:
    jsonpath_expression = parse(f'HEADERS[*].SUB_HEADERS[?(@.HEADER_ID=={mapping_id}) & 
                                (@.HEADER_IXML_PARAID != "")].HEADER_IXML_PARAID, SECTION_TEXT_PARAID_LIST')
    match = jsonpath_expression.find(self.tagged_sections)

Tags: textnameidparsesectionmappinglistheaders
1条回答
网友
1楼 · 发布于 2024-09-23 22:29:31

我不确定您正在使用哪个库,但许多实现都支持逗号分隔键:['foo','bar']。您可以将其与递归下降运算符一起使用:..

$..[?(@.HEADER_ID==8.3) & (@.HEADER_IXML_PARAID != "")].HEADER_IXML_PARAID, SECTION_TEXT_PARAID_LIST

您还有一些被认为是非标准的语法,尽管您的库可能支持这些语法。我会把它改成

$..                                                        // recursive descent
  [?(@.HEADER_ID==8.3 && @.HEADER_IXML_PARAID != "")]      // item filter
  ['HEADER_IXML_PARAID', 'SECTION_TEXT_PARAID_LIST']       // prop selection

最后一件事是我想象中您所要求的:组合过滤器表达式

$..
  [?(@.HEADER_ID==1 || @.HEADER_ID==8.3) && @.HEADER_IXML_PARAID != "")]
  ['HEADER_IXML_PARAID', 'SECTION_TEXT_PARAID_LIST']

请注意,这只会选择HEADER_IXML_PARAIDSECTION_TEXT_PARAID_LIST并返回集合中的所有值;它不能确保它们之间保持联系

相关问题 更多 >