Запись json из канала bash с несколькими переменными интерполяциями

#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