2016-12-08 3 views
1

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配列の各配列要素を変換したい:

  1. キー「name」を持つ属性値は、そのmap要素のキーに昇格します。

  2. "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 
    } 
} 

ありがとうございました。

答えて

1

、フィルタ:

map({ (.name): (.monit + {pid}) }) | add 

は生成します。

{ 
    "myapp": { 
    "memory": 13795328, 
    "cpu": 0, 
    "pid": 1419 
    }, 
    "calendar-viewer": { 
    "memory": 22761472, 
    "cpu": 0, 
    "pid": 1425 
    } 
} 
+0

完全に動作します。 map()を使用していただきありがとうございます。 – Rolf

1

私は専門家ではありませんが、概念的にはあなたが後にしているのは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 
    } 
} 
+0

これは問題なく動作します。私はから答えが好きですが、それは簡単です。私は "ピーク"は、彼が主に最高の答えをスローするので(jpの著者の一人だと思う) – Rolf

関連する問題