Замена значения JSON на основе пары ключ-значение на jq - PullRequest
0 голосов
/ 20 марта 2019

У меня есть JSON со следующей структурой

{
   "name": "name",
   "id": [
        "abcdef"
   ],
   "input_dataobjects": [
     {
        "id": "someid1",
        "name": "somename1",
        "provider": "someprovider",
        "datatype": "somedatatype1"
    },
    {
        "name": "some_name2",
        "datatype": "some_datatype2",
        "id": "some_id2"
    }
  ]
}

Чего я пытаюсь достичь

в input_dataobjects, если datatype == somedatatype1, то name = sonemewname1.

Я могу использовать индекс input_dataobjects, поскольку мой json всегда имеет одинаковую структуру. Но есть ли другой способ добиться этого, анализируя input_dataobjects и находя индекс для замены? Я использую jq для выполнения операций JSON.

Я пытался использовать индекс как .input_dataobjects[0].name="someting", потому что я всегда знаю положение типа данных.

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Самое простое и, возможно, наиболее эффективное решение проблемы, как указано:

.input_dataobjects |=
  map( if .datatype == "somedatatype1"
       then .name = "sonemewname1"
       else . end )
0 голосов
/ 20 марта 2019

вот альтернативное решение, основанное на jtc утилита unix:

Если я правильно понял ваш вопрос, вы хотите сопоставить datatype== somedatatype1, а если совпадет, то обновите верхний name с братом name datatype?

если так, то решение на основе jtc выглядит так:

bash $ <file.json jtc -w'[name]' -u'[datatype]:<somedatatype1>[-1][name]'
{
   "id": [
      "abcdef"
   ],
   "input_dataobjects": [
      {
         "datatype": "somedatatype1",
         "id": "someid1",
         "name": "somename1",
         "provider": "someprovider"
      },
      {
         "datatype": "some_datatype2",
         "id": "some_id2",
         "name": "some_name2"
      }
   ],
   "name": "somename1"
}
bash $ 

Если вам просто нравится обновлять / изменять одноуровневую name записи, тогда запустите так:

bash $ <file.json jtc -w'[datatype]:<somedatatype1>[-1][name]' -u'"sonemewname1"'
{
   "id": [
      "abcdef"
   ],
   "input_dataobjects": [
      {
         "datatype": "somedatatype1",
         "id": "someid1",
         "name": "sonemewname1",
         "provider": "someprovider"
      },
      {
         "datatype": "some_datatype2",
         "id": "some_id2",
         "name": "some_name2"
      }
   ],
   "name": "name"
}
bash $ 

вот jtc полное руководство пользователя

...