Как я могу повторить значение вместе с вложенными значениями в запросе JMESPath?

Проблема

Я хотел бы распаковать объект в массив объектов, повторяя ключ верхнего уровня вместе со значениями из вложенного массива. Это кажется достаточно тривиальным, но ни одно из руководств или примеров на jmespath.org не касается этого случая.

Входные данные

{
  "name": "ryan",
  "pets": [
    "charlie",
    "michael",
    "snorlax",
    "socrates",
    "apollo"
  ]
}

Желаемый результат

[
  {
    "owner": "ryan",
    "pet_name": "charlie"
  },
  {
    "owner": "ryan",
    "pet_name": "michael"
  },
  {
    "owner": "ryan",
    "pet_name": "snorlax"
  },
  {
    "owner": "ryan",
    "pet_name": "socrates"
  },
  {
    "owner": "ryan",
    "pet_name": "apollo"
  }
]

Попытки решения

Это генерирует несколько объектов, но я не понимаю, как взять с собой ключ owner для поездки:

$ jp -f test.json 'pets[].{owner: name, pet: @}'
[
  {
    "owner": null,
    "pet": "charlie"
  },
  {
    "owner": null,
    "pet": "michael"
  },
  {
    "owner": null,
    "pet": "snorlax"
  },
  {
    "owner": null,
    "pet": "socrates"
  },
  {
    "owner": null,
    "pet": "apollo"
  }
]

Это дает нужную информацию, но не создает несколько объектов:

$ jp -f test.json '[{owner: name, pet_name: pets[] }]'
[
  {
    "owner": "ryan",
    "pet_name": [
      "charlie",
      "michael",
      "snorlax",
      "socrates",
      "apollo"
    ]
  }
]


person ryantuck    schedule 09.10.2020    source источник


Ответы (1)


Пожалуйста, проверьте аналогичный вопрос: JMESPath выражение для сглаживания массива объектов, каждый из которых содержит вложенные массивы объектов, похоже, это невозможно сделать в чистом выражении JMESPath, поскольку оно работает в одной области. В связанном ответе вы найдете примеры, как справиться с этим в контексте доступности или использования jq.

person michalskalski    schedule 03.12.2020