Есть ли способ удалить тот же ключ из списка объектов во вложенном поле? - PullRequest
3 голосов
/ 21 мая 2019

Я настраиваю конвейер devops, чтобы определенные профили данных, хранящиеся в формате JSON, можно было перемещать на разные серверы. При загрузке с текущего сервера мне нужно очистить все защищенные ключи и уникальные идентификаторы. Я ищу самый чистый способ сделать следующее в JQ

Введите:

{
   "TopKey1":{
      "some_key":"some_value"
   },
   "TopKey2":{
      "some_key2":"some_value2"
   },
   "KeytoSearch":[
      {
         "_id":"sdf",
         "non_relevant_key1":"val"
      },
      {
         "_id":"sdfdsdf",
         "non_relevant_key2":"val"
      },
      {
         "_id":"sgf",
         "non_relevant_key3":"val"
      }
   ]
}

Выход:

{
   "TopKey1":{
      "some_key":"some_value"
   },
   "TopKey2":{
      "some_key2":"some_value2"
   },
   "KeytoSearch":[
      {
         "non_relevant_key1":"val"
      },
      {
         "non_relevant_key2":"val"
      },
      {
         "non_relevant_key3":"val"
      }
   ]
}

В терминах Python, если бы это был словарь

for json_object in dictionary["KeytoSearch"]:
  json_object.pop("_id")

Я пробовал сочетания map и del, но, похоже, не могу определить вложенную индексацию с этим. Сообщения об ошибках, которые я получаю, совпадают с jq: error (at <stdin>:277): Cannot index string with string "_id", что говорит о том, что я не совсем понял, как работает jq или как его использовать, но мне нужно идти по этому пути, потому что я использую скрипт Python для очистки Объекты JSON - это то, чего я бы лучше избегал

Ответы [ 3 ]

3 голосов
/ 21 мая 2019

Я пробовал комбинации карт и дель

Хорошо! Возможно, вы просто упускали магический ингредиент '| =':

.Keytosearch |= map( del(._id) )
3 голосов
/ 21 мая 2019

Исходя из введенного вами JSON и предполагая, что в вашем KeytoSearch объекте есть другие свойства, а также поля _id, вы можете просто сделать это ниже.

jq 'del(.KeytoSearch[]._id)'

См. этот фрагмент jqplay.org для демонстрации.Кавычки вокруг ключа свойства, содержащие _, не нужны, что подтверждается одним из комментариев ниже.Некоторые метасимволы (например, . в значениях ключей свойств должны быть доступны с кавычками, например ".id") должны быть указаны в кавычках, но _ явно не является одним из них.

2 голосов
/ 21 мая 2019

альтернативно, вы можете использовать Unix-инструмент Walk-Path для JSON: jtc и применить изменения прямо в исходный файл JSON (-f):

bash $ jtc -fpw'[KeytoSearch]<_id>l:' file.json 
bash $ 
bash $ 
bash $ jtc file.json 
{
   "KeytoSearch": [
      {
         "non_relevant_key1": "val"
      },
      {
         "non_relevant_key2": "val"
      },
      {
         "non_relevant_key3": "val"
      }
   ],
   "TopKey1": {
      "some_key": "some_value"
   },
   "TopKey2": {
      "some_key2": "some_value2"
   }
}
bash $ 

если данный фрагмент json является частью большего JSON (и [KeytoSearch] не адресуется из корня), то замените его поисковой лексемой: <KeytoSearch>l.

PS> Раскрытие информации: я создатель инструмента jtc

...