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)