将数组转换为对象内的对象

时间:2020-09-23 17:25:58

标签: json jq

一段时间以来,我一直在与这个问题作斗争,我看了一些有关该主题的文章。我似乎无法完全达到我的目标。我有一些想要转换的原始json数据。

基于label.env(目前仅使用一个env)对对象进行分组,然后将来自原始json的那些对象插入名为projects的对象中。

orginial_json

{
  "createTime": "2020-06-25T14:16:45.720Z",
  "labels": {
    "cb_domain": "cloud-services",
    "cb_product": "infra",
    "env": "prod",
    "owner": "cloud-server"
  },
  "lifecycleState": "ACTIVE",
  "name": "projectname",
  "parent": {
    "id": "123456577",
    "type": "folder"
  },
  "projectId": "projectname-324234",
  "projectNumber": "962363417856"
}
{
  "createTime": "2020-06-24T19:45:42.851Z",
  "labels": {
    "cb_domain": "cloud-services",
    "cb_product": "ad",
    "env": "prod",
    "owner": "cloud-server"
  },
  "lifecycleState": "ACTIVE",
  "name": "projectname2",
  "parent": {
    "id": "4352564765437",
    "type": "folder"
  },
  "projectId": "projectname2-4567",
  "projectNumber": "3243456324"
}

我正在使用jq -s 'group_by(.labels.env) | .[] | { (.[0].labels.env) : { projects: .[] | . } }' 将原始json数据嵌套到由env \ projects分组的对象中,该方法可以工作,但似乎可以复制它,而不是将每个对象都放在项目中。

{
  "prod": {
    "projects": {
      "createTime": "2020-06-25T14:16:45.720Z",
      "labels": {
        "cb_domain": "cloud-services",
        "cb_product": "infra",
        "env": "prod",
        "owner": "cloud-server"
      },
      "lifecycleState": "ACTIVE",
      "name": "projectname",
      "parent": {
        "id": "770593713153",
        "type": "folder"
      },
      "projectId": "projectname-324234",
      "projectNumber": "962363417856"
    }
  }
}
{
  "prod": {
    "projects": {
      "createTime": "2020-06-24T19:45:42.851Z",
      "labels": {
        "cb_domain": "cloud-services",
        "cb_product": "ad",
        "env": "prod",
        "owner": "cloud-server"
      },
      "lifecycleState": "ACTIVE",
      "name": "projectname2",
      "parent": {
        "id": "4352564765437",
        "type": "folder"
      },
      "projectId": "projectname2-4567",
      "projectNumber": "3243456324"
    }
  }
}

我的目标是

{
  "prod": {
    "projects": {
      "createTime": "2020-06-25T14:16:45.720Z",
      "labels": {
        "cb_domain": "cloud-services",
        "cb_product": "infra",
        "env": "prod",
        "owner": "cloud-server"
      },
      "lifecycleState": "ACTIVE",
      "name": "projectname",
      "parent": {
        "id": "770593713153",
        "type": "folder"
      },
      "projectId": "projectname-324234",
      "projectNumber": "962363417856"
    },
    {
      "createTime": "2020-06-24T19:45:42.851Z",
      "labels": {
        "cb_domain": "cloud-services",
        "cb_product": "ad",
        "env": "prod",
        "owner": "cloud-server"
      },
      "lifecycleState": "ACTIVE",
      "name": "projectname2",
      "parent": {
        "id": "4352564765437",
        "type": "folder"
      },
      "projectId": "projectname2-4567",
      "projectNumber": "3243456324"
    }
  }
}





1 个答案:

答案 0 :(得分:0)

考虑到Q中的一些细微差异,jq程序的以下变体似乎可以实现您想要实现的目标:

group_by(.labels.env)
| .[]
| .[0].labels.env as $key
| { ($key) : { projects: . } }