Изменить значение объекта в JSON на основе другого значения ключа - оболочки - PullRequest
0 голосов
/ 16 апреля 2020

в оболочке У меня есть следующий объект

[
{
  "ParameterKey":"a",
  "ParameterValue":"1"
},
{
  "ParameterKey":"b",
  "ParameterValue":"2"
},
{
  "ParameterKey":"c",
  "ParameterValue":"3"
},
{
  "ParameterKey":"d",
  "ParameterValue":"4"
}
]

Мне нужно выяснить, как получить доступ к ParameterKeys 'b' и 'd' оптимальным способом (БЕЗ использования индексов массива), используя, например, jq так что результирующий массив будет:

[
{
  "ParameterKey":"a",
  "ParameterValue":"1"
},
{
  "ParameterKey":"b",
  "ParameterValue":"5"
},
{
  "ParameterKey":"c",
  "ParameterValue":"3"
},
{
  "ParameterKey":"d",
  "ParameterValue":"6"
}
]

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Это изменит одно значение ParameterValue для ParameterName

jq '[.[] | select(.ParameterKey == "b") .ParameterValue |= "5"]'

[
  {
    "ParameterKey": "a",
    "ParameterValue": "1"
  },
  {
    "ParameterKey": "b",
    "ParameterValue": "5"
  },
  {
    "ParameterKey": "c",
    "ParameterValue": "3"
  },
  {
    "ParameterKey": "d",
    "ParameterValue": "4"
  }
]

Попробуйте онлайн!

Если вы не хотите жестко задавать ключ и значение, вы можно использовать --arg

jq --arg key "b" --arg value "5" '[.[] | select(.ParameterKey == $key) .ParameterValue |= $value]' </tmp/data.json

[
  {
    "ParameterKey": "a",
    "ParameterValue": "1"
  },
  {
    "ParameterKey": "b",
    "ParameterValue": "5"
  },
  {
    "ParameterKey": "c",
    "ParameterValue": "3"
  },
  {
    "ParameterKey": "d",
    "ParameterValue": "4"
  }
]

Надеюсь, это поможет!

0 голосов
/ 16 апреля 2020

Непонятно, что именно вы спрашиваете, но следующий фильтр jq решает одну интерпретацию вопроса:

map(if .ParameterKey == "b" then .ParameterValue = "5"
    elif .ParameterKey == "d" then .ParameterValue = "6"
    else . end)

Вот альтернативный подход, использующий один объект JSON для определения ключа / значения пары, определяющие обновление:

map( {(.ParameterKey): .ParameterValue} )
| add + {b:"5", d:"6"}
| to_entries
| map( {ParameterKey: .key, ParameterValue: .value} )

...