2017-08-31 34 views
1

我有json,如下所示。我想要得到一个输出,每个计时器记录包含一行,但包含服务的名称。jq获得父数组中的每个值

{ 
    "services":{ 
     "service":[ 
     { 
      "name":"Test Value", 
      "timer":[ 
       { "datetime":"08/30/2017 16:33:35", "value":"625" }, 
       { "datetime":"08/30/2017 16:22:38", "value":"240" } 
      ] 
     }, 
     { 
      "name":"Test Value 2", 
      "timer":[ 
       { "datetime":"08/30/2017 16:07:38", "value":"432" }, 
       { "datetime":"08/30/2017 15:59:07", "value":"1355" } 
      ] 
     } 
     ] 
    } 
} 

我拿出.services.service[].name as $name | .services.service[].timer | map([ $name, .datetime, .value ]),这让我

[["Test Value","08/30/2017 16:33:35","625"],["Test Value","08/30/2017 16:22:38","240"]] 
[["Test Value","08/30/2017 16:07:38","432"],["Test Value","08/30/2017 15:59:07","1355"]] 
[["Test Value 2","08/30/2017 16:33:35","625"],["Test Value 2","08/30/2017 16:22:38","240"]] 
[["Test Value 2","08/30/2017 16:07:38","432"],["Test Value 2","08/30/2017 15:59:07","1355"]] 

,我很期待的产出将是

[["Test Value","08/30/2017 16:33:35","625"],["Test Value","08/30/2017 16:22:38","240"]] 
[["Test Value 2","08/30/2017 16:07:38","432"],["Test Value 2","08/30/2017 15:59:07","1355"]] 

但要注意的是,值被复制两个服务和一组定时器。我错过了什么?

回答

2

.services.service[]|[{name,timer:.timer[]}|[.name,.timer[]]]会给你期望的输出,

.services.service[]|{name,timer:.timer[]}|[.name,.timer[]](不阵列整合)会给你一个结果为每个定时器:

["Test Value","08/30/2017 16:33:35","625"] 
["Test Value","08/30/2017 16:22:38","240"] 
["Test Value 2","08/30/2017 16:07:38","432"] 
["Test Value 2","08/30/2017 15:59:07","1355"] 

你在你的射门偏出什么是

表达式exp为$ x | ...表示:对于表达式exp的每个值,用整个原始输入运行管道的其余部分,并将$ x设置为该值。因此作为foreach循环的函数。

如果你真的想用您需要做这样的变量:.services.service[]| .name as $name | .timer | map([ $name, .datetime, .value ])

0

我认为这将是有益的尝试,并在你的数据在水平方面进行可视化,并在您希望它成为你的结果。当扁平化数据层次时,我认为更容易考虑它是否在一个层次上取值,并将其与下一层次的值相结合。

因此,在查看各个服务对象时,您希望获取名称,并将其与其计时器对象的属性组合起来,并为每个组合生成结果。所以从这里开始:

[.name] + (properties of the timer objects) 

然后您需要生成properties of the timer objects

.timer[] | [.datetime, .value] 

可以为已读此:“为timer阵列中的每个项,创建包括所述datetimevalue特性的阵列。”

一旦你把所有东西都放在同一层次上,你可以根据需要重新排列值,但幸运的是在我们的例子中,一切都在我们想要的地方。

放在一起,这个表达式产生名称,日期时间和值的单个数组,但是您希望将它们收集在一个数组中。所以把它们放进去。

[[.name] + (.timer[] | [.datetime, .value])] 

当你把它放在一起,你会得到你的结果。

.services.service[] | [[.name] + (.timer[] | [.datetime, .value])] 
1

这里是另一个演示数组构造函数变体的解决方案。请注意每个中[]的位置稍有不同。与您的数据,该过滤器

.services.service[] | {name} + .timer[] 

生成对象

{"name":"Test Value","datetime":"08/30/2017 16:33:35","value":"625"} 
{"name":"Test Value","datetime":"08/30/2017 16:22:38","value":"240"} 
{"name":"Test Value 2","datetime":"08/30/2017 16:07:38","value":"432"} 
{"name":"Test Value 2","datetime":"08/30/2017 15:59:07","value":"1355"} 

此滤波器

.services.service[] | [ {name} + .timer[] ] 

生成对象数组为每个服务

[{"name":"Test Value","datetime":"08/30/2017 16:33:35","value":"625"},{"name":"Test Value","datetime":"08/30/2017 16:22:38","value":"240"}] 
[{"name":"Test Value 2","datetime":"08/30/2017 16:07:38","value":"432"},{"name":"Test Value 2","datetime":"08/30/2017 15:59:07","value":"1355"}] 

本的单个流过滤器

.services.service[] | {name} + .timer[] | [.[]] 

生成阵列

["Test Value","08/30/2017 16:33:35","625"] 
["Test Value","08/30/2017 16:22:38","240"] 
["Test Value 2","08/30/2017 16:07:38","432"] 
["Test Value 2","08/30/2017 15:59:07","1355"] 

流和该过滤器

.services.service[] | [ {name} + .timer[] | [.[]] ] 

产生数组的数组为每个服务

[["Test Value","08/30/2017 16:33:35","625"],["Test Value","08/30/2017 16:22:38","240"]] 
[["Test Value 2","08/30/2017 16:07:38","432"],["Test Value 2","08/30/2017 15:59:07","1355"]]