фильтрация данных geo JSON с использованием JMESPath не работает - PullRequest
1 голос
/ 23 января 2020

Я пытаюсь отфильтровать некоторые данные из структуры данных geo JSON, показанной ниже:

 "features": [
 {
      "type": "Feature",
      "properties": {
        "@id": "node/7071544593",
        "addr:city": "Joensuu",
        "addr:housenumber": "12",
        "addr:postcode": "80100",
        "addr:street": "Siltakatu",
        "addr:unit": "C 33",
        "alt_name": "Crasman Oy Joensuu",
        "alt_name_1": "Crasman Oy",
        "name": "Crasman Joensuu",
        "short_name": "Crasman",
        "website": "https://www.crasman.fi"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          29.7621398,
          62.6015236
        ]
      },
      "id": "node/7071544593"
    },
    {
      "type": "Feature",
      "properties": {
        "@id": "node/7117872562",
        "amenity": "car_rental",
        "operator": "avis"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          29.7630643,
          62.6036656
        ]
      },
      "id": "node/7117872562"
    }
]

То, что я пытаюсь сделать, это перебрать этот массив функций, заглянуть в объект свойств чтобы проверить, если он содержит веб-сайт, если да, то я могу распечатать его координаты из объекта геометрии. Вот что я попробовал:

Features[*].properties[?contains(@,'website')=='true'].geometry.coordinates

Это дает мне нулевое значение

1 Ответ

0 голосов
/ 28 марта 2020

Попробуйте:

features[?contains(keys(properties),'website')].geometry.coordinates

Например:

$ jp "features[?contains(keys(properties),'website')].geometry.coordinates" <input.json
[
  [
    29.7621398,
    62.6015236
  ]
]

В связи с тем, почему ваш пример не сработал:

  • Идентификаторы регистр- чувствительный, поэтому вам нужно features, а не Features.
  • properties - это объект, а не массив, поэтому вы не можете применить к нему выражение фильтра.
  • Даже если бы вы могли, это не properties, который вы хотите фильтровать. Вы пытаетесь отфильтровать целые features.
  • contains тесты, если массив содержит элемент (или если строка содержит подстроку), а не наличие у ключа ключа. Вы можете использовать keys() для получения ключей объекта в массиве.
  • Вам не нужно сравнивать результат от contains() до true, это уже логическое значение.
  • Даже если вы пытаетесь сравнить с true, вам нужно использовать обратные пометки: `true`, а не кавычки 'true'.
...