如何在JMESPath查询中与嵌套值一起重复一个值?

问题描述

问题

我想将一个对象解压缩为一个对象数组,并在嵌套数组中的值旁边重复一个顶级键。这似乎微不足道,但是jmespath.org上的所有教程或示例都没有涉及这种情况。

输入数据

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

所需结果

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

尝试的解决方

这会生成多个对象,但是我不清楚如何随身携带owner键:

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

这会带来正确的信息,但不会生成多个对象:

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

解决方法

请检查类似的问题:JMESPath expression to flatten array of objects,each with nested arrays of objects似乎无法在纯JMESPath表达式中执行,因为它在单个作用域上操作。在链接的答案中,您将找到示例如何在ansible或使用jq的情况下处理此问题。