在JMESPATH中的数组中合并子哈希

时间:2019-05-17 14:38:39

标签: jmespath

我有一个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丢失)

2 个答案:

答案 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函数,则可以使用maxmin函数,只是我需要一个函数来将数组转换为值:)!

如果您想再次将结果弄平(没有方括号),通常就不能以简单的方式做到这一点(我不认为有可能,但是如果可能的话,会有些棘手)。 / 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"
  }
}