【问题标题】:Combine two JSONPath queries合并两个 JSONPath 查询
【发布时间】:2021-09-06 09:29:41
【问题描述】:

我需要将以下 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)

【问题讨论】:

  • 你有样本数据吗?你能展示一下你的尝试吗?
  • 对不起,我应该问过。你在期待什么? (您要返回哪些值?)
  • @gregsdennis,对于特定的HEADER_ID,我需要HEADER_IXML_PARAIDSECTION_TEXT_PARAID_LIST。特定的 HEADER_ID 可以直接在 HEADERSSUB_HEADERS 内。

标签: python jsonpath jsonpath-ng


【解决方案1】:

我不确定您使用的是哪个库,但许多实现都支持逗号分隔键:['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 并返回集合中的所有值;它不能确保它们保持相互关联。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2012-09-02
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多