gpt4 book ai didi

json - jq:如何将不相交的对象值组合为键/值对的单个对象?

转载 作者:行者123 更新时间:2023-12-02 09:13:27 24 4
gpt4 key购买 nike

如果我有一个 JSON 输入数据:

输入.json

{
"metadata": {
"guid": "07f90eed-105d-41b2-bc20-4c20dfb51653"
},
"entity": {
"name": "first"
}
}
{
"metadata": {
"guid": "da187e3a-8db9-49fd-8c05-41f29cf87f51"
},
"entity": {
"name": "second"
}
}
{
"metadata": {
"guid": "6685c3af-5427-4add-8764-7b18ae3c23bb"
},
"entity": {
"name": "third"
}
}

我想从中创建以下内容:

{
"first": "07f90eed-105d-41b2-bc20-4c20dfb51653",
"second": "da187e3a-8db9-49fd-8c05-41f29cf87f51",
"third": "6685c3af-5427-4add-8764-7b18ae3c23bb"
}

也就是说,输入数据是单独的 JSON 对象的集合,每个对象都具有所示的结构。我希望输出是单个 JSON 对象,其中键是 .entity.name,值是 .metadata.guid

我试过:

jq -r '{.entity.name: .metadata.guid}' input.json
jq -r 'map({(.entity.name): .metadata.guid})' input.json

但是这些只会产生语法错误。我得到的最接近的是:

jq -r '.entity.name as $name|.metadata.guid as $guid | { ($name) : ($guid) }' input.json
{
"first": "07f90eed-105d-41b2-bc20-4c20dfb51653"
}
{
"second": "da187e3a-8db9-49fd-8c05-41f29cf87f51"
}
{
"third": "6685c3af-5427-4add-8764-7b18ae3c23bb"
}

但是,仍然有 3 个对象(不是 1 个)。

我确实得到了一份表格来满足我的要求,但我怀疑有更简单的方法:

jq -r '.entity.name as $name|.metadata.guid as $guid | { ($name) : ($guid) }' input.json | jq -s add
{
"first": "07f90eed-105d-41b2-bc20-4c20dfb51653",
"second": "da187e3a-8db9-49fd-8c05-41f29cf87f51",
"third": "6685c3af-5427-4add-8764-7b18ae3c23bb"
}

任何想法如何正确地做到这一点?

最佳答案

使用单个 jq 命令:

jq -s '[.[] | { (.entity.name): .metadata.guid }] | add' input.json
  • -s (--slurp) - 不是为输入中的每个 JSON 对象运行过滤器,而是将整个输入流读入一个大数组并运行只过滤一次。

输出:

{
"first": "07f90eed-105d-41b2-bc20-4c20dfb51653",
"second": "da187e3a-8db9-49fd-8c05-41f29cf87f51",
"third": "6685c3af-5427-4add-8764-7b18ae3c23bb"
}

关于json - jq:如何将不相交的对象值组合为键/值对的单个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49573125/

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