JSON和jq更新多个值

时间:2017-04-04 17:15:51

标签: json bash updates jq

您好我正在尝试在单个“jq”命令中执行计算,但我无法锻炼如何引用新值。

原始JSON

{
  "Status": "Down",
  "StatusID": "75328241",
  "Start": "2017-03-17 15:06:40",
  "End": "2017-03-17 15:08:37",
  "Period": "1 Minutes "
}

我的目标是将开始和结束时间转换为纪元,并以秒为单位锻炼持续时间。然后使用新值输出相同的对象。

当我这样做时

echo $J_SON | jq '.Start |= (strptime("%Y-%m-%d %H:%M:%S") | mktime),.End |= (strptime("%Y-%m-%d %H:%M:%S") | mktime)'

输出是:

{
  "Status": "Down",
  "StatusID": "75328241",
  "Start": 1489763200,
  "End": "2017-03-17 15:08:37",
  "Period": "1 Minutes "
}
{
  "Status": "Down",
  "StatusID": "75328241",
  "Start": "2017-03-17 15:06:40",
  "End": 1489763317,
  "Period": "1 Minutes "
}

哪个有意义,手册说这是默认行为。

  

分配在jq中的工作方式与大多数编程的工作方式略有不同   语言。 jq不区分引用和副本   某事 - 两个对象或数组相等或不相等,   没有任何进一步的概念是“同一个对象”或“不一样”   对象”。

     

如果一个对象有两个字段,即数组,.foo和.bar,那么你   向.foo附加一些东西,然后.bar就不会变大,即使   你以前设置过.bar = .foo。如果你习惯于编程   你可以想到Python,Java,Ruby,Javascript等语言   就像jq在它之前完成每个对象的完整深层副本一样   分配(为了表现它实际上并没有这样做,但是   这是一般的想法。)

但我想在epoch和seconds中输出值。

我成功地获得了这样的持续时间:

echo $J_SON | jq '.Period = ((.End | strptime("%Y-%m-%d %H:%M:%S") | mktime)-(.Start | strptime("%Y-%m-%d %H:%M:%S") | mktime))'

输出

{
  "Status": "Down",
  "StatusID": "75328241",
  "Start": "2017-03-17 15:06:40",
  "End": "2017-03-17 15:08:37",
  "Period": 117
}

问题:

我可以获取每个变量的各个值,但不知道如何在单个输出对象中将它们连接起来。

1 个答案:

答案 0 :(得分:4)

您可以将更新链接在一起,如下所示:

.Start |= (strptime("%Y-%m-%d %H:%M:%S") | mktime)
| .End |= (strptime("%Y-%m-%d %H:%M:%S") | mktime)
| .Period = (.End - .Start)