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

时间:2020-10-09 20:54:43

标签: 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"
    ]
  }
]

1 个答案:

答案 0 :(得分:0)

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