我有一个5层深的哈希哈希。在3级,我有Docker映像。我使用JMESPATH查询projects.*.docker_images
来检索这些图像。现在我得到这样的结果:
[
{
"image1": {
"registry_url": "blah"
}
},
{
"image2": {
"registry_url": "blah"
},
"image3": {
"registry_url": "blah"
}
}
]
如何将其展平为:
{
"image1": {
"registry_url": "blah"
},
"image2": {
"registry_url": "blah"
},
"image3": {
"registry_url": "blah"
}
}
附录1
使用过滤运算符可以使我更接近,但目前为止还没有。
projects.*.docker_images | [0]
创建:
{
"image1": {
"registry_url": "blah"
},
"image2": {
"registry_url": "blah"
}
}
(注释image3
丢失)
答案 0 :(得分:0)
我有解决方案,但没有答案。我将在这里保留我的解决方案,但待有人提出更好的答案时,请不要提出任何疑问。
解决方案是:将源数据从哈希/字典/对象重组为数组/列表,如下所示:
[
[
{
"name": "image1",
"registry_url": "blah"
}
],
[
{
"name": "image2",
"registry_url": "blah"
},
{
"name": "image3",
"registry_url": "blah"
}
]
]
然后使用projects.*.docker_images[]
检索数据。现在扁平化的[]
可以按预期工作,并为我提供了一系列对象。
答案 1 :(得分:0)
编辑:要正确回答,我将在您的帖子中认为您的JSON很好,所以这是我的答案:
@.{image1: @[0].image1, image2: @[1].image2, image3: @[1].image3} | [@.image1, @.image2, @.image3] | @.[{image1: @[0]},{image2: @[1]},{image3: @[2]}]
您得到了:
[
{
"image1":{
"registry_url":"blah"
}
},
{
"image2":{
"registry_url":"blah"
}
},
{
"image3":{
"registry_url":"blah"
}
}
]
并根据此请求:
@[*].{name: keys(@)[0], registry_url: join('',*.registry_url)}
您将得到以下结果:
[
{
"name": "image1",
"registry_url": "blah"
},
{
"name": "image2",
"registry_url": "blah"
},
{
"name": "image3",
"registry_url": "blah"
}
]
如果Registry_url(类型)有任何问题,您不必使用join
函数,则可以使用max
或min
函数,只是我需要一个函数来将数组转换为值:)!
如果您想再次将结果弄平(没有方括号),通常就不能以简单的方式做到这一点(我不认为有可能,但是如果可能的话,会有些棘手)。 / p>
因此整个请求是:@.{image1: @[0].image1, image2: @[1].image2, image3: @[1].image3} | [@.image1, @.image2, @.image3] | @.[{image1: @[0]},{image2: @[1]},{image3: @[2]}] | @[*].{name: keys(@)[0], registry_url: join('',*.registry_url)}
实际上是可行的,但我认为这不是最好的方法!
如果您想不使用方括号(仅使用大括号),请执行此操作(但如果执行此操作,则必须在对象上放置属性:
所以这是请求:@.{image1: @[0].image1, image2: @[1].image2, image3: @[1].image3} | [@.image1, @.image2, @.image3] | @.[{image1: @[0]},{image2: @[1]},{image3: @[2]}] | @[*].{name: keys(@)[0], registry_url: join('',*.registry_url)} | @.{obj1: @[0], obj2: @[1], obj3: @[2]}}
结果如下:
{
"obj1": {
"name": "image1",
"registry_url": "blah"
},
"obj2": {
"name": "image2",
"registry_url": "blah"
},
"obj3": {
"name": "image3",
"registry_url": "blah"
}
}