#json #jq
#json #jq
Вопрос:
У меня есть этот вывод из канала
{
"pipelineName": "pipelineName-AAAAQ6UFM",
"pipelineVersion": 2,
"stageStates": [
{
"stageName": "Approval",
"inboundTransitionState": {
"enabled": true
},
"actionStates": [
{
"actionName": "Approval",
"latestExecution": {
"status": "InProgress",
"token": "aaaa-aaaa-4316-a95f-2efc51d05761"
}
}
],
"latestExecution": {
"pipelineExecutionId": "fc73f4cb-c5a9-44a8-8fc1-d7e50259f485",
"status": "InProgress"
}
}
]
}
Я пытаюсь написать json следующим образом
{
"pipelineName": "pipelineName-AAAAQ6UFM",
"stageName": "Approval",
"actionName": "Approval",
"token": "aaaa-aaaa-4316-a95f-2efc51d05761",
"result": {
"status": "Approved",
"summary": ""
}
}
Возможно, я мог бы установить две переменные из pipeoutput с помощью команды read, но я не знаю, как установить их обе.
токен
jq -r ' .stageStates[] | select(.stageName == "Approval") | .actionStates[0].latestExecution.token'
pipelineName
jq -r '.pipelineName'
Тогда я мог бы написать json с помощью команды jq.
Каков наилучший способ сделать это?
Ответ №1:
Исходя из вашего select(.stageName == "Approval")
, может показаться, что вы пытаетесь параметризовать с помощью «stageName», поэтому следующее может быть близко к тому, что вы ищете:
"Approval" as $stage
| { pipelineName, stageName: $stage, actionName: $stage }
(.stageStates[]
| select(.stageName == $stage).actionStates[]
| select(.actionName == $stage)
| {token: .latestExecution.token, result: {status: "Approved", summary: ""}})
Ответ №2:
Вы можете использовать только jq
для создания json:
jq ' .stageName = .stageStates[0].stageName
| .actionName = .stageStates[0].actionStates[0].actionName
| .token = .stageStates[0].actionStates[0].latestExecution.token
| .result = { "status": "Approved", "summary": "" }
| del(.stageStates, .pipelineVersion)
' file.json