【发布时间】:2018-03-30 10:57:15
【问题描述】:
如果我有 JSON 输入数据:
input.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"
}
任何想法如何正确地做到这一点?
【问题讨论】:
-
不应该是一个对象数组吗?看起来像无效的 JSON
-
jq 可以很好地处理不相交的对象。它不是单个 JSON 对象/数组/字符串等,但 jq 并不要求它只对单个实体进行操作。
-
获取三个对象的更简单方法是
jq '{(.entity.name): .metadata.guid}' input.json。将.entity.name包装到括号中告诉jq将其作为表达式而不是字符串进行计算。