在并行节点上使用条件查询JSONPath

问题描述 投票:0回答:1

我的 JSON 具有特定的名称值和与并行节点中的名称值关联的 id(不要问我为什么,但我没有设计 JSON)。我想根据特定的 id 检索名称值。例如,我想根据

NAME - ABC Creations
 检索 
ID - 50200df3-7476-4bab-86ab-1aae4c097095

我正在使用

jsonpath-ng
python 库

Full JSON:

{
   "Document":[
      {
         "Fields":[
            {
               "Type":{
                  "Text":"NAME",
                  "Confidence":97.65931701660156
               },
               "ValueDetection":{
                  "Text":"ABC Creations"
               },
               "PageNumber":1,
               "GroupProperties":[
                  {
                     "Types":[
                        "RECEIVER_SOLD_TO"
                     ],
                     "Id":"50200df3-7476-4bab-86ab-1aae4c097095"
                  }
               ]
            },
            {
               "Type":{
                  "Text":"NAME",
                  "Confidence":92.77919006347656
               },
               "ValueDetection":{
                  "Text":"Hardwood Industries, Inc."
               },
               "PageNumber":1,
               "GroupProperties":[
                  {
                     "Types":[
                        "VENDOR_REMIT_TO"
                     ],
                     "Id":"844e1bf2-6adb-43fc-af41-bb26844bffe6"
                  }
               ]
            },
            {
               "Type":{
                  "Text":"NAME",
                  "Confidence":93.58846282958984
               },
               "ValueDetection":{
                  "Text":"HARDWOOD INDUSTRIES, INC."
               },
               "PageNumber":1,
               "GroupProperties":[
                  {
                     "Types":[
                        "VENDOR"
                     ],
                     "Id":"1f7ec071-8c24-4160-979a-3c44d6884d55"
                  }
               ]
            }
         ]
      }
   ]
}

我可以使用以下方法检索所有名称值:

$.Document[*].Fields[?(@.Type.Text=='NAME')].ValueDetection.Text

Output is:

[
  "ABC Creations",
  "Hardwood Industries, Inc.",
  "HARDWOOD INDUSTRIES, INC."
]

如果我根据 Id 查询,我不会得到名称:

$.Document[*].Fields[*].GroupProperties[?(@.Id=='50200df3-7476-4bab-86ab-1aae4c097095')]

Output:

[
  {
    "Types": [
      "RECEIVER_SOLD_TO"
    ],
    "Id": "50200df3-7476-4bab-86ab-1aae4c097095"
  }
]

如有任何建议或帮助,我们将不胜感激。

jsonpath jsonpath-ng
1个回答
0
投票

您需要使用嵌套查询。

$.Document[*]
   .Fields[?
     @.GroupProperties[?
       @.Id == '50200df3-7476-4bab-86ab-1aae4c097095'
     ]
   ]
 .ValueDetection.Text

(单行)

$.Document[*].Fields[[email protected][[email protected] == '50200df3-7476-4bab-86ab-1aae4c097095']].ValueDetection.Text

前几段

$.Document[*]
让您进入
Fields
数组。接下来,您要开始搜索项目。

外部查询找到所有带有

GroupProperties
的对象。因为这不与任何内容进行比较,所以它形成了“存在测试”,这意味着如果返回任何值,则选择查询适用的节点。

内部查询将外部查询细化为仅

GroupProperties
数组中具有适当
Id
值的对象。

一旦确定了外部集合,您就可以使用

.ValueDetection.Text
选择所需的值。


嵌套查询并未得到普遍支持,因此您可能需要检查您正在使用的实现,但这确实符合待定的 JSON 路径规范

您可以在 https://json-everything.net/json-path(我的 .Net 实现的游乐场)玩这个。

© www.soinside.com 2019 - 2024. All rights reserved.