Node.js pm2プロセスリスト(pm2 jlist > pm2-jlist.json
)のJSONを変換してフィードしたいcollectd(テレメトリー)に若干異なるフォーマット。JSON配列をJSONマップに変換する方法:特定の配列要素の属性値が各マップのキーになる
入力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
}
}
だから私は、次のようにJSONマップ要素に入力JSON配列の各配列要素を変換したい:
キー「name」を持つ属性値は、そのmap要素のキーに昇格します。
"monit"サブツリーの属性は、そのマップのキーの下に統合されています(この部分はすでに動作しています)。
配列に複数の要素が含まれていると、出力が得られません。
#1を試してみてください。これはほとんど正しいですが、出力は1つのではなくJSONオブジェクトの2つの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
}
}
ありがとうございました。
完全に動作します。 map()を使用していただきありがとうございます。 – Rolf