jq select() returns false 时如何使用回退值
How to use fallback value when jq select() returns false
假设我有一个这样的 JSON 数组:
[
{
"name": "alpha",
"value": 1
},
{
"name": "beta",
"value": 2
},
...
]
(它包含大约 50-100 个项目;这是一个简化的示例。)
我想从中生成一个 JSON 对象,如下所示:
{
"alpha": 1,
"beta" 2,
...
}
我认为它的 jq 过滤器看起来像这样:
.[] | {
"alpha": select(.name == "alpha") | .value,
"beta": select(.name == "beta") | .value,
...
}
当我在 https://jqplay.org/s/SOKd4oCh2k 上尝试时,这实际上不起作用,但我认为它非常接近。
好的,现在这是棘手的部分:有时带有 "name": "alpha"
(或 "name": "beta"
等)的对象实际上并不存在于输入数组中!在那种情况下,我想打印 "alpha": null
或 "alpha": ""
。但我不知道如何将其集成到我的 select()
调用中。
在实践中,我需要它从批处理调度系统中抓取作业指标,在 运行 性能测试中,我会随着时间的推移更改指标,因此我正在查询的任何给定指标可能不会存在特定工作 运行,但我仍想查看该工作 运行.
的所有 other 指标
当然,在发布这个之后,我就明白了。我想到的解决方案是使用 add()
函数将对象数组展平为单个对象。
所以这个过滤器:
[.[] | { (.name): .value }] | add
产生:
{
"alpha": 1,
"beta": 2
}
然后select我感兴趣的各个字段,就是基本的对象创建;例如| {alpha, beta, gamma}
(输入数组中缺少“gamma”)产生:
{
"alpha": 1,
"beta": 2,
"gamma": null
}
万一有人想玩这个:https://jqplay.org/s/vqEYyGCg7W
我会暂时搁置这个问题,以防有人有更好的解决方案!
问题的 jq 式解决方案如下所示:
jq 'from_entries | {alpha, beta, gamma}' input.json
这会将数组转换为对象,然后 select 对应于指定键的值(如果存在),同时还要确保所有指定键都存在。
密钥列表
如果你有一个 JSON 键名数组(比如 $keylist),你可以这样写:
from_entries as $in
| reduce $keylist[] as $key ({}; .[$key]=$in[$key])
回退值
或者,如果您想指定自己的后备值,请说 $default:
from_entries as $in
| reduce $keylist[] as $key ({}; .[$key] = $in[$key] // $default)
或者(取决于您的详细要求):
from_entries as $in
| reduce $keylist[] as $key ({};
.[$key] = if ($in | has($key)) then $in[$key] else $default end)
假设我有一个这样的 JSON 数组:
[
{
"name": "alpha",
"value": 1
},
{
"name": "beta",
"value": 2
},
...
]
(它包含大约 50-100 个项目;这是一个简化的示例。)
我想从中生成一个 JSON 对象,如下所示:
{
"alpha": 1,
"beta" 2,
...
}
我认为它的 jq 过滤器看起来像这样:
.[] | {
"alpha": select(.name == "alpha") | .value,
"beta": select(.name == "beta") | .value,
...
}
当我在 https://jqplay.org/s/SOKd4oCh2k 上尝试时,这实际上不起作用,但我认为它非常接近。
好的,现在这是棘手的部分:有时带有 "name": "alpha"
(或 "name": "beta"
等)的对象实际上并不存在于输入数组中!在那种情况下,我想打印 "alpha": null
或 "alpha": ""
。但我不知道如何将其集成到我的 select()
调用中。
在实践中,我需要它从批处理调度系统中抓取作业指标,在 运行 性能测试中,我会随着时间的推移更改指标,因此我正在查询的任何给定指标可能不会存在特定工作 运行,但我仍想查看该工作 运行.
的所有 other 指标当然,在发布这个之后,我就明白了。我想到的解决方案是使用 add()
函数将对象数组展平为单个对象。
所以这个过滤器:
[.[] | { (.name): .value }] | add
产生:
{
"alpha": 1,
"beta": 2
}
然后select我感兴趣的各个字段,就是基本的对象创建;例如| {alpha, beta, gamma}
(输入数组中缺少“gamma”)产生:
{
"alpha": 1,
"beta": 2,
"gamma": null
}
万一有人想玩这个:https://jqplay.org/s/vqEYyGCg7W
我会暂时搁置这个问题,以防有人有更好的解决方案!
问题的 jq 式解决方案如下所示:
jq 'from_entries | {alpha, beta, gamma}' input.json
这会将数组转换为对象,然后 select 对应于指定键的值(如果存在),同时还要确保所有指定键都存在。
密钥列表
如果你有一个 JSON 键名数组(比如 $keylist),你可以这样写:
from_entries as $in
| reduce $keylist[] as $key ({}; .[$key]=$in[$key])
回退值
或者,如果您想指定自己的后备值,请说 $default:
from_entries as $in
| reduce $keylist[] as $key ({}; .[$key] = $in[$key] // $default)
或者(取决于您的详细要求):
from_entries as $in
| reduce $keylist[] as $key ({};
.[$key] = if ($in | has($key)) then $in[$key] else $default end)