2017-08-23 27 views
0

我有這個文件:從另一個創建一個JSON,具有額外數​​據VA JQ

[ 
    "smoke-tests", 
    "push-apps-manager" 
] 

我想用JQ獲得這個輸出:

{ 
    "errands": [ 
    {"name": "smoke-tests", "post_deploy": true}, 
    {"name": "push-apps-manager", "post_deploy": true} 
    ] 
} 

它似乎很簡單,但,我這裏有這麼大的困難......

回答

2

這是一個有點棘手,因爲你需要輸入嵌入到綁定到errands鍵列表。

% jq '.[] | {name: ., post_deploy: true}' names.json 
{ 
    "name": "smoke-tests", 
    "post_deploy": true 
} 
{ 
    "name": "push-apps-manager", 
    "post_deploy": true 
} 

然後包裹在列表中的外部對象:

% jq '{errands: [.[] | {name: ., post_deploy: true}]}' names.json 
{ 
    "errands": [ 
    { 
     "name": "smoke-tests", 
     "post_deploy": true 
    }, 
    { 
     "name": "push-apps-manager", 
     "post_deploy": true 
    } 
    ] 
} 

您也可以使用map功能(我很少記得如何通過創建name/post_deploy對象的順序啓動使用正確,但結果很簡單):

% jq '{errands: map({name:., post_deploy: true})}' names.json 
+0

100%真棒!現在,使用哪種方法?說實話,我喜歡地圖方法,我會去那。 – AG6HQ

+0

可能是'map';說實話,仔細看看手冊頁,我不知不覺地用我的第一個解決方案重新實現了'map'。 ('map'被定義爲* [。[] | x]'。) – chepner

1

這是另一種方法。如果你是新來JQ它可能是最容易實現的小步驟的目標而努力。

1)與所述身份濾波器

. 

其產生如預期啓動

[ 
    "smoke-tests", 
    "push-apps-manager" 
] 

2)下用"errands"密鑰添加外部對象:

{ "errands": . } 

產生

{ 
    "errands": [ 
    "smoke-tests", 
    "push-apps-manager" 
    ] 
}  

3)下一個將數據移動到一個數組

{ "errands": [ . ] } 

產生

{ 
    "errands": [ 
    [ 
     "smoke-tests", 
     "push-apps-manager" 
    ] 
    ] 
} 

4)與"name""post_deploy"密鑰添加內部對象

{ "errands": [ { "name": ., "post_deploy": true } ] } 

其產生

{ 
    "errands": [ 
    { 
     "name": [ 
     "smoke-tests", 
     "push-apps-manager" 
     ], 
     "post_deploy": true 
    } 
    ] 
} 

5)現在我們非常接近。所有我們需要做的就是好好把握JQObject Construction behavior when an expression produces multiple results

{ "errands": [ { "name": .[], "post_deploy": true } ] } 

這給了我們預期的結果

{ 
    "errands": [ 
    { 
     "name": "smoke-tests", 
     "post_deploy": true 
    }, 
    { 
     "name": "push-apps-manager", 
     "post_deploy": true 
    } 
    ] 
} 
+0

太棒了!謝謝你的提示... – AG6HQ