Как динамически обновлять параметры json - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть файл workflow.log в формате json. Я хочу обновить файл json с обновленными значениями с параметрами, предоставленными во время выполнения. Например, я хочу обновить «XXXXXX» с некоторым значением, передаваемым через параметр, такой как «ZZZZZZZ»,Я создал сценарий оболочки, хранящий содержимое файла в переменной с именем WKFL_DET и использующий его в команде curl.Теперь я не уверен, что делать дальше, чтобы использовать переменные $ p_id и $ p_file_name.

workflow.log

 "Workparams": [
        {
          "$id": "12",
          "WorkflowParmId": 84232,
          "WorkflowId": 9766,
          "Name": "SYS_FILE_DT",
          "Value": "2018-09-28"
        },
        {
          "$id": "13",
          "WorkflowParmId": 221910,
          "WorkflowId": 9766,
          "Name": "V_FILE_NAME",
          "Value": "XXXXXX"
        },
        {
          "$id": "14",
          "WorkflowParmId": 221908,
          "WorkflowId": 9766,
          "Name": "V_ID",
          "Value": "1111"
        }

curl.sh

    #!/bin/sh   
    export p_id=$1
    export p_file_name=$2
    function func
{   
    WKFL_DET=`cat ${workflow.log}`

     curl -X PUT -H '"$HEADER_ACCEPT"' -H ${HEADER_JSON_CONTENT} -H Authorization:'Bearer AAEAAJ038MNIYpxfgQvsjk4eC4Hx2' -d "${WKFL_DET}" -o ${V_WF_PARAMS}_new http://someaddress.com/workflows/646
}
func

ожидаемый результат должен быть:

    workflow.log 
"Workparams": [
    {
      "$id": "12",
      "WorkflowParmId": 84232,
      "WorkflowId": 9766,
      "Name": "SYS_FILE_DT",
      "Value": "2018-09-28"
    },
    {
      "$id": "13",
      "WorkflowParmId": 221910,
      "WorkflowId": 9766,
      "Name": "V_FILE_NAME",
      "Value": "ZZZZZZ" ------- from parameter $p_file_name
    },
    {
      "$id": "14",
      "WorkflowParmId": 221908,
      "WorkflowId": 9766,
      "Name": "V_ID",
      "Value": "5555" ----- from parameter $p_id
    }

Надеюсь, я объяснил свою проблему.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Обратите внимание, что для таких случаев вы должны использовать инструменты парсера JSON, такие как jg.Атака грубой силы для конкретной проблемы с использованием Perl приведена ниже.Проверьте это:

> export p_id=5555
> export p_file=ZZZZZZ
> perl -pe '$x++ if /V_FILE_NAME/;$y++ if /V_ID/;s/XXXXXX/$ENV{p_file}/ if $x and /Value/ and $x--;s/1111/$ENV{p_id}/ if $y and /Value/ and $y--' workflow.log
"Workparams": [
        {
          "$id": "12",
          "WorkflowParmId": 84232,
          "WorkflowId": 9766,
          "Name": "SYS_FILE_DT",
          "Value": "2018-09-28"
        },
        {
          "$id": "13",
          "WorkflowParmId": 221910,
          "WorkflowId": 9766,
          "Name": "V_FILE_NAME",
          "Value": "ZZZZZZ"
        },
        {
          "$id": "14",
          "WorkflowParmId": 221908,
          "WorkflowId": 9766,
          "Name": "V_ID",
          "Value": "5555"
        }
]

>
0 голосов
/ 02 декабря 2018

Используя , вы можете легко и надежно выполнить преобразование, как показано ниже:

export p_id=5555
export p_file_name=ZZZZZZ

< so-workflow.json jq --arg id "${p_id}" --arg fn "${p_file_name}" '
 .Workparams |= map(if .Name == "V_FILE_NAME"
                    then .Value = $fn 
                    elif .Name == "V_ID" 
                    then .Value = $id 
                    else . end)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...