如何将JSON数组转换为JSON映射:一个特定的数组元素属性值成为每个映射的关键

时间:2016-12-08 00:20:29

标签: json dictionary jq

我想转换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元素,如下所示:

  1. 带有键" name"的属性值被提升为该地图元素的关键。

  2. " monit"下的属性子树在该地图的键下合并(此部分已经有效)。

  3. 如果数组包含多个元素,我无法获得所需的输出。

    尝试#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
      }
    }
    

    感谢您的时间。

2 个答案:

答案 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
  }
}