我想转换Node.js pm2进程列表(pm2 jlist > pm2-jlist.json
)的JSON,以便以稍微不同的格式将其提供给collectd(遥测)。
输入JSON:
[
{
"pid": 1419,
"name": "myapp",
"pm_id": 0,
"monit": {
"memory": 13795328,
"cpu": 0
}
},
{
"pid": 1425,
"name": "calendar-viewer",
"pm_id": 1,
"monit": {
"memory": 22761472,
"cpu": 0
}
}
]
预期产出:
{
"myapp": {
"cpu": 0,
"memory": 14548992,
"pid": 1419
},
"calendar-viewer": {
"cpu": 0,
"memory": 16957440,
"pid": 1425
}
}
所以我想将Input JSON数组的每个数组元素转换为JSON map元素,如下所示:
带有键" name"的属性值被提升为该地图元素的关键。
" monit"下的属性子树在该地图的键下合并(此部分已经有效)。
如果数组包含多个元素,我无法获得所需的输出。
尝试#1:这几乎是正确的但是输出包含2个json对象(语法无效)而不是1个json对象......
cat pm2-jlist.json | jq '.[] | {(.name): {pid: .pid,cpu: .monit.cpu, memory: .monit.memory}}'
{
"myapp": {
"pid": 1419,
"cpu": 0,
"memory": 14548992
}
}
{
"calendar-viewer": {
"pid": 1425,
"cpu": 0,
"memory": 16957440
}
}
尝试#2:我只能过滤掉1个json对象,但我想要1个json对象中的所有项目......
cat pm2-jlist.json | jq '.[] | select(.name == "calendar-viewer")| {(.name): {pid: .pid, cpu: .monit.cpu, memory: .monit.memory}}'
{
"calendar-viewer": {
"pid": 1425,
"cpu": 0,
"memory": 16957440
}
}
感谢您的时间。
答案 0 :(得分:1)
我不是jq专家,但从概念上讲,你所追求的是reduce
。
鉴于我希望事情能够发挥作用,这是我最好的猜测......
reduce .[] as $item ({}; .[$item.name] = {"cpu" : $item.monit.cpu, "memory" : $item.monit.memory, "pid" : $item.pid})
对于它的价值,jqplay.org为您的输入和上面的过滤器生成以下输出:
{
"myapp": {
"cpu": 0,
"memory": 13795328,
"pid": 1419
},
"calendar-viewer": {
"cpu": 0,
"memory": 22761472,
"pid": 1425
}
}
答案 1 :(得分:1)
根据您的输入,过滤器:
map( { (.name): (.monit + {pid} ) } ) | add
产生
{
"myapp": {
"memory": 13795328,
"cpu": 0,
"pid": 1419
},
"calendar-viewer": {
"memory": 22761472,
"cpu": 0,
"pid": 1425
}
}