json - jq select()返回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
or "alpha": ""
。但我不知道如何将它整合到我的select()
通话中。
在实践中,我需要它从批处理调度系统中抓取作业指标,在运行性能测试时我会随着时间的推移更改指标,因此对于特定的作业运行,我查询的任何给定指标可能不存在,但我仍然希望查看该作业运行的所有其他指标。
解决方案
该问题的 jq-esque 解决方案如下所示:
jq 'from_entries | {alpha, beta, gamma}' input.json
这会将数组转换为对象,然后选择与指定键对应的值(如果存在),同时确保所有指定键都存在。
密钥表
如果你有一个 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)
推荐阅读
- javascript - 通过python websockets发送后用JS解码JSON字符串
- dart - 使用 List 中的 where 命令遍历其内容
- php - 如何包含当前主题路径中的 PHP 文件?
- c - 将(?)用户输入字符更改为另一种字符 c 语言
- vb.net - 如何在网站 vb.net 中单击图像按钮
- html - 如何显示彼此相邻并浮动到右侧的 Bootstrap 4 导航栏链接?
- sql-server - %2 在运算符左侧的 where 子句中指定了什么?
- django - 验证数据中不存在图像
- php - php oop、pdo 和 ajax 实例问题
- javascript - 如何在 Vue js 中使 localStorage 中的数据具有反应性