jmesPath查询查找帮助。这个查询正确吗?

时间:2018-11-19 16:58:58

标签: jmespath

我有这个JSON对象:

{
            id: {
              name: "BBCommercialPropertyStructureFloodCoverage",
            },
            carrierData: null,
            link: [
              {
                key: "Location",
                select: {
                  key: "ARRAY_INDEX",
                  value: 0,
                },
              },
              {
                key: "structure",
                select: {
                  key: "ARRAY_INDEX",
                  value: 1,
                },
              },
              {
                key: "Coverage",
                select: {
                  key: "ARRAY_INDEX",
                  value: 0,
                },
              },
            ],
          },

我有几个具有不同索引值的对象。例如,如果我想与此id/name: "BBCommercialPropertyStructureFloodCoverage"进行匹配,并且位置也是值0,结构是值1,如何使用jmespath做到这一点?

到目前为止,我已经拥有了:

const floodCoverageQuery = [?id.name=='BBCommercialPropertyStructureFloodCoverage' && link[key=='Location' && select.value==0]] && link[key=="structure" && select.value==1]]

这对吗?

1 个答案:

答案 0 :(得分:2)

首先,您放入答案中的对象树不是真正的JSON。我已经对其进行了转换,请参见下文。另外,我认为该对象需要包装在一个列表([...])中,因为您说“我有几个这些对象” ;并且“迄今”拥有的jmespath查询以[?...开头,表示您有一个列表。

answer

这应该可行,我已经在jmespath.org上对其进行了测试:

[?id.name=='BBCommercialPropertyStructureFloodCoverage' && link[?key=='Location' && select.value==`0`] && link[?key=='structure' && select.value==`1`]]

您的解决方案出了什么问题?

您的原始查询是这样:

  

[?id.name=='BBCommercialPropertyStructureFloodCoverage' && link[key=='Location' && select.value==0]] && link[key=="structure" && select.value==1]]

这是我发现的:

  • 右括号(])太多。因此,==0]] &&应该是==0] &&(少一个括号)。
  • 您混用了单引号和双引号('")。仅单引号有效raw string literals。 (或者,您可以编写⁠`"string"`⁠,相当于'string'。)
  • 在反引号(⁠`0`⁠⁠`1`⁠内包装整数值(0和1),请参见literal expressions
  • 检查keyselect.value的内括号是filter expressions,因此您需要将它们括在[?]内,而不仅仅是[...]

FTR,实际输入为JSON

[
  {
    "id": {
      "name": "BBCommercialPropertyStructureFloodCoverage"
    },
    "carrierData": null,
    "link": [
      {
        "key": "Location",
        "select": {
          "key": "ARRAY_INDEX",
          "value": 0
        }
      },
      {
        "key": "structure",
        "select": {
          "key": "ARRAY_INDEX",
          "value": 1
        }
      },
      {
        "key": "Coverage",
        "select": {
          "key": "ARRAY_INDEX",
          "value": 0
        }
      }
    ]
  }
]