изменить вложенный массив JSON с помощью JQ - PullRequest
0 голосов
/ 07 июня 2018

Я хотел бы использовать JQ для изменения следующего ввода JSON:

{
  "rows": [
    {
      "fields": [
        {
          "name": "id",
          "value": "k1"
        },
        {
          "name": "val",
          "value": "2340378b211aa3d8f2d7607cbddce883b87b191d0425736641e3d308ea329718"
        },
        {
          "name": "Encoding",
          "value": "hex"
        }
      ]
    },
    {
      "fields": [
        {
          "name": "id",
          "value": "k2"
        },
        {
          "name": "val",
          "value": "2340378b211aa3d8f2d7607cbddce883b87b191d0425736641e3d308ea329718"
        },
        {
          "name": "Encoding",
          "value": "hex"
        }
      ]
    }
  ]
}

, чтобы значение "hex" поля "value" с именем "Encoding" было изменено на "oct" только для строки, содержащей поле с .name=="id" and .value=="k1".

Как бы я это сделал?Я могу select поле с .value=="k1" и т. Д., Но я не могу найти способ "подняться по дереву", чтобы впоследствии обновить поле "Encoding".

Вводнельзя ожидать, чтобы иметь фиксированный порядок полей / строк.

1 Ответ

0 голосов
/ 07 июня 2018

Использование any/2 дает фильтр jq, который близко соответствует описанию проблемы на английском языке:

.rows |= map( if any(.fields[]; .name=="id" and .value=="k1")
              then .fields |= map(if .name == "Encoding"
                                  then .value = "oct"
                                  else .
                                  end)
              else .
              end )

Использование когда / 2

Чуть менее подробное и, возможно, более ясное решениевозможно, если мы используем удобную функцию общего назначения, определенную следующим образом:

def when(filter; action): if (filter?) // null then action else . end;

Затем мы можем написать просто:

.rows[] |= when( any(.fields[]; .name=="id" and .value=="k1");
                 .fields |= map( when (.name == "Encoding";
                                       .value = "oct")))

Предостережения

  • Вы можетехотите проверить, есть ли значение .value == "hex", прежде чем изменить его на "oct".
  • Вышеуказанные фильтры могут потенциально изменить более одной пары имя / значение на "строку".
...