Справка по поиску запроса jmesPath.Правильный ли этот запрос? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть этот объект 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 голосов
/ 08 декабря 2018

Прежде всего, дерево объектов, которое вы указали в ответе, не является истинным JSON. Я преобразовал это, см. Ниже. Кроме того, я полагаю, что объект должен быть заключен в список ([...]), потому что вы говорите "У меня есть несколько таких объектов" ; и запрос jmespath, который у вас есть до сих пор, начинается с [?..., что означает, что у вас есть список.

ответ

это должно работать, я проверял это на 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] && (на одну скобку меньше).
  • Вы смешали одинарные и двойные кавычки (' и "). Допустимы только одинарные кавычки необработанные строковые литералы . ( Альтернативно , вы можете написать ⁠`"string"`⁠, что эквивалентно 'string'.)
  • Обернуть целочисленные значения (0 и 1) внутри обратных кавычек (⁠`0`⁠ и ⁠`1`⁠), см. буквенные выражения .
  • Внутренние скобки, где вы проверяете key и select.value, являются выражениями фильтра , поэтому вам нужно заключить их в [? и ] вместо просто [...].

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
        }
      }
    ]
  }
]
...