JMESPath текущий индекс массива

В JMESPath с этим запросом:

people[].{"index":@.index,"name":name, "state":state.name}

На этом примере данные:

{
  "people": [
    {
      "name": "a",
      "state": {"name": "up"}
    },
    {
      "name": "b",
      "state": {"name": "down"}
    },
    {
      "name": "c",
      "state": {"name": "up"}
    }
  ]
}

Я получил:

[
  {
    "index": null,
    "name": "a",
    "state": "up"
  },
  {
    "index": null,
    "name": "b",
    "state": "down"
  },
  {
    "index": null,
     "name": "c",
     "state": "up"
  }
]

Как мне заставить свойство index действительно иметь индекс массива? Я понимаю, что @.index - неправильный синтаксис, но не смог найти функцию, которая возвращала бы индекс. Есть ли способ включить текущий индекс массива?


person TerrierJack    schedule 25.07.2018    source источник


Ответы (2)


Это не совсем та форма, которую вы запрашивали, но у меня есть для вас возможный ответ:

people[].{"name":name, "state":state.name} | merge({count: length(@)}, @[*])

этот запрос дает такой результат:

{
  "0": {
    "name": "a",
    "state": "up"
  },
  "1": {
    "name": "b",
    "state": "down"
  },
  "2": {
    "name": "c",
    "state": "up"
  },
  "count": 3
}

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

person bosskay972    schedule 23.08.2019
comment
Какую реализацию jmespath вы использовали для этого? Когда я тестирую с помощью github.com/jmespath/jmespath.terminal, результат {"count": 3, "name": "state"} - person harschware; 15.09.2020

Вариант использования

  • Используйте синтаксис запроса Jmespath для извлечения числового индекса текущего элемента массива из ряда элементов массива.

Ловушки

  • На момент написания этой статьи (2019-03-22) эта функция не является частью стандартной спецификации Jmespath.

Обходной путь

  • Это возможно при запуске Jmespath из любого из различных языков программирования, однако это должно быть сделано за пределами Jmespath.
person dreftymac    schedule 23.03.2019