Объедините несколько файлов JSON и включите имя файла каждого файла в результирующий объект.

У меня есть сотни файлов с именем [guid].json, структура которых выглядит примерно так:

{
  "Active": true,
  "CaseType": "CaseType",
  "CustomerGroup": ["Core", "Extended"]
}

Сначала мне нужно добавить новую пару ключ-значение ко всем файлам с "CaseId": "[filename]", а затем объединить их все в один большой массив и сохранить его как новый файл манифеста json.

Мне нужен один файл со следующей структурой из команды jq:

[
  {
    "Active": true,
    "CaseType": "CaseType",
    "CustomerGroup": ["Core", "Extended"],
    "CaseId": "43d47f66-5a0a-4b86-88d6-1f1f893098d2"
  },
  {
    "Active": true,
    "CaseType": "CaseType",
    "CustomerGroup": ["Core", "Extended"],
    "CaseId": "e3x47f66-5a0a-4b86-88d6-1f1f893098d2"
  }
]

person Jonas    schedule 19.10.2020    source источник
comment
Но ваш ожидаемый результат показывает CaseId так же, как 43d47f66-5a0a-4b86-88d6-1f1f893098d2 ? Разве они не должны быть уникальными   -  person Inian    schedule 19.10.2020
comment
О .. опечатка, спасибо за указание на это ????   -  person Jonas    schedule 19.10.2020


Ответы (2)


Вы ищете input_filename.

jq -n '[ inputs | .CaseId = input_filename ]' *.json
person oguz ismail    schedule 19.10.2020
comment
Только один дополнительный вопрос. Можно ли избежать .json как части значения CaseId? - person Jonas; 19.10.2020
comment
Конечно. Используйте 1_ - person oguz ismail; 19.10.2020

Вы можете использовать reduce добавление к одному входному объекту за раз. Используйте input_filename, чтобы получить имя файла в кодировке UTF-8, и сформируйте запись с помощью CaseId

jq -n 'reduce inputs as $d (null; . + [ $d + { CaseId: input_filename } ] )' *.json
person Inian    schedule 19.10.2020