首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用jq对json进行分组,然后转换为yaml

如何使用jq对json进行分组,然后转换为yaml
EN

Stack Overflow用户
提问于 2021-08-05 22:10:34
回答 2查看 607关注 0票数 2

我有个json我想改信。

代码语言:javascript
复制
[
  {
    "externalGroup": "another group admins",
    "groupId": "da2e42c8-6423-4d32-99b5-5fc58f9f80b8"
  },
  {
    "externalGroup": "another group users",
    "groupId": "7c69cac1-4a70-4170-8251-cde3762fe498"
  },
  {
    "externalGroup": "my group admin",
    "groupId": "e08a1d9d-f108-4e87-bdb3-ee4f10c6752a"
  },
  {
    "externalGroup": "my group users",
    "groupId": "8370821e-edfa-4615-ac2e-47815b740f40"
  },
  {
    "externalGroup": "some group",
    "groupId": "e08a1d9d-f108-4e87-bdb3-ee4f10c6752a"
  },
  {
    "externalGroup": "some group",
    "groupId": "8370821e-edfa-4615-ac2e-47815b740f40"
  },
  {
    "externalGroup": "some group",
    "groupId": "7c69cac1-4a70-4170-8251-cde3762fe498"
  }
]

我已经尝试过这个,它非常接近:jq '. | group_by(.externalGroup)[] | {(.[0].externalGroup): map(.groupId)}'

我明白了:

代码语言:javascript
复制
{
  "another group admins": [
    "da2e42c8-6423-4d32-99b5-5fc58f9f80b8"
  ]
}
{
  "another group users": [
    "7c69cac1-4a70-4170-8251-cde3762fe498"
  ]
}
{
  "my group admin": [
    "e08a1d9d-f108-4e87-bdb3-ee4f10c6752a"
  ]
}
{
  "my group users": [
    "8370821e-edfa-4615-ac2e-47815b740f40"
  ]
}
{
  "some group": [
    "e08a1d9d-f108-4e87-bdb3-ee4f10c6752a",
    "8370821e-edfa-4615-ac2e-47815b740f40",
    "7c69cac1-4a70-4170-8251-cde3762fe498"
  ]
}

但这不能与yq正确地转换。它需要看起来像这样:

代码语言:javascript
复制
{
  "another group admins": [
    "da2e42c8-6423-4d32-99b5-5fc58f9f80b8"
  ],
  "another group users": [
    "7c69cac1-4a70-4170-8251-cde3762fe498"
  ],
  "my group admin": [
    "e08a1d9d-f108-4e87-bdb3-ee4f10c6752a"
  ],
  "my group users": [
    "8370821e-edfa-4615-ac2e-47815b740f40"
  ],
  "some group": [
    "e08a1d9d-f108-4e87-bdb3-ee4f10c6752a",
    "8370821e-edfa-4615-ac2e-47815b740f40",
    "7c69cac1-4a70-4170-8251-cde3762fe498"
  ]
}

为了得到这样的东西:

代码语言:javascript
复制
"another group admins":
  - "da2e42c8-6423-4d32-99b5-5fc58f9f80b8"
"another group users":
  - "7c69cac1-4a70-4170-8251-cde3762fe498"
"my group admin":
  - "e08a1d9d-f108-4e87-bdb3-ee4f10c6752a"
"my group users":
  - "8370821e-edfa-4615-ac2e-47815b740f40"
"some group":
  - "e08a1d9d-f108-4e87-bdb3-ee4f10c6752a",
  - "8370821e-edfa-4615-ac2e-47815b740f40",
  - "7c69cac1-4a70-4170-8251-cde3762fe498"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-05 22:35:47

您缺少的部分是from_entries,它可以从键和值数组构建JSON对象。

而不是:

代码语言:javascript
复制
jq '. | group_by(.externalGroup)[] | {(.[0].externalGroup): map(.groupId)}'

尝试:

代码语言:javascript
复制
jq 'group_by(.externalGroup) | map({key:.[0].externalGroup, value:map(.groupId)}) | from_entries'
代码语言:javascript
复制
{
  "another group admins": [
    "da2e42c8-6423-4d32-99b5-5fc58f9f80b8"
  ],
  "another group users": [
    "7c69cac1-4a70-4170-8251-cde3762fe498"
  ],
  "my group admin": [
    "e08a1d9d-f108-4e87-bdb3-ee4f10c6752a"
  ],
  "my group users": [
    "8370821e-edfa-4615-ac2e-47815b740f40"
  ],
  "some group": [
    "e08a1d9d-f108-4e87-bdb3-ee4f10c6752a",
    "8370821e-edfa-4615-ac2e-47815b740f40",
    "7c69cac1-4a70-4170-8251-cde3762fe498"
  ]
}

我做了以下修改:

anything.

  • Removed

  • 在开始时删除了. |,因为它不改变[],而是使用map(...),因为我们希望将事物保存在一个数组中,以传递给组装一个条目对象的from_entries.

  • Instead,所以我们创建了{key:..., value:...}对来向from_entries.

提供提要。

实际上,我刚刚检查了一下,发现add实际上比from_entries快一点,即使是在很长的列表中也是如此。如果使用add,则需要更改更少的解决方案。

代码语言:javascript
复制
jq 'group_by(.externalGroup) | map({(.[0].externalGroup):map(.groupId)}) | add'

将对象添加到一起将它们的内容组合在一起。我用一个250,000个元素列表进行了测试,它比from_entries稍快一些。考虑到它也更短,在我看来也很清楚,我认为它值得考虑。

票数 3
EN

Stack Overflow用户

发布于 2021-08-06 02:18:03

  1. 是生产yaml的一个值得考虑的替代方案是gojq,jq的Go实现,例如

代码语言:javascript
复制
   gojq --yaml-output '
     group_by(.externalGroup) 
    | map({(.[0].externalGroup):map(.groupId)}) | add'

为了避免

  1. 的开销,您可以使用以下通用的面向流的add来处理对象或数组以及数字:

代码语言:javascript
复制
    gojq --yaml-output '
      def add(s): reduce s as $x (null; . + $x);
      add( group_by(.externalGroup)[] 
           | {(.[0].externalGroup):map(.groupId)})'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68674042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档