使用jq处理JSON-将数组索引/名称处理为输出

时间:2019-12-25 03:40:12

标签: json jq

我正在尝试使用jq为我解析JSON文件。我想从定义标头中获取一个值代替索引,并输出到输出数据中。简化示例:

{
  "header": {
    "type": {
      "0": {
             "name": "Cats"
           },
      "3": {
             "name": "Dogs"
           }
    }
  },
  "data": [
    {
      "time": "2019-01-01T02:00:00Z",
      "reading": { 
                   "0": {"value": 90, "note": "start" },
                   "3": {"value": 100 }
                 } 
    }
  ]
}

使用jq '.data[] | {time: .time, data: .reading[]}'之类的jq命令会给我:

  "time": "2019-01-01T02:00:00Z",
  "data": {
    "value": 90,
    "note": "start"
  }
}
{
  "time": "2019-01-01T02:00:00Z",
  "data": {
    "value": 100
  }
}

我需要将“ Cats”或“ Dogs”放入结果中,以进行SQL插入。

类似的东西:

{
  "time": "2019-01-01T02:00:00Z",
  "data": {
    "type: "Cats",      <- line added
    "value": 90,
    "note": "start"
  }
}
...

或更妙的是:

{
  "time": "2019-01-01T02:00:00Z",
  "Cats": {                    <- label set to "Cats" instead of "data"
    "value": 90,
    "note": "start"
  }
}
...

有没有办法获取-我看到的数组索引为“ 0”或“ 3”-被添加为“猫”或“狗”?

1 个答案:

答案 0 :(得分:1)

使用内置函数INDEX创建字典可以实现以下简单的解决方案:

(.header.type
 | INDEX(to_entries[]; .key)
 | map_values(.value.name)) as $dict
| .data[] 
| (.reading | keys_unsorted[]) as $k
| {time} + { ($dict[$k]) : .reading[$k] }

输出

{
  "time": "2019-01-01T02:00:00Z",
  "Cats": {
    "value": 90,
    "note": "start"
  }
}
{
  "time": "2019-01-01T02:00:00Z",
  "Dogs": {
    "value": 100
  }
}