gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:18:03 25 4
gpt4 key购买 nike

我有这个要转换的 json。

[
{
"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)}'我明白了:
{
"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 正确转换。它需要看起来像这样:
{
"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"
]
}
为了得到类似的东西:
"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"

最佳答案

您丢失的那块是 from_entries它可以从一组键和值构建一个 JSON 对象。
代替:

jq '. | group_by(.externalGroup)[] | {(.[0].externalGroup): map(.groupId)}'
尝试:
jq 'group_by(.externalGroup) | map({key:.[0].externalGroup, value:map(.groupId)}) | from_entries'
{
"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"
]
}
我做了以下更改:
  • 删除了 . |一开始,因为它不会改变任何东西。
  • 删除了 []并使用 map(...)相反,因为我们想将东西保存在一个数组中以提供给 from_entries .
  • 我们创建了 {key:..., value:...},而不是组装一个入口对象。对喂给 from_entries .

  • 其实,我刚刚查了一下,有点惊讶地发现 add实际上比 from_entries快一点即使是很长的列表。如果您使用 add您需要更改的解决方案甚至更少。
    jq 'group_by(.externalGroup) | map({(.[0].externalGroup):map(.groupId)}) | add'
    将对象加在一起将它们的内容组合在一起。我用 250,000 个元素列表进行了测试,它比 from_entries 略快.鉴于它也更短并且在我看来几乎同样清晰,我认为它值得考虑。

    关于json - 如何使用jq对json进行分组然后转换为yaml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68674042/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com