2017-08-31 46 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"]]