jq добавить содержимое файла в json и обновить

Я пытаюсь использовать объект JSON из вызова REST API GET, а затем добавить в него содержимое необработанного файла (в данном случае файла .md), используя jq перед обновлением того же объекта с помощью вызова PUT.

Я использую следующее, чтобы ПОЛУЧИТЬ файл и записать его локально:

curl -u USERNAME:PASSWORD 'https://example.com/myfile.json' | cat > ./test.json

Формат файла JSON следующий:

{
  "content" : "My JSON content",
  "owner":...
}

Я хотел бы добавить содержимое необработанного файла в content, поэтому результат выглядит следующим образом:

{
  "content" : "My markdown file contents.\n\nMy JSON content",
  "owner":...
}

а затем обновите исходный JSON с помощью вызова PUT:

curl -u USERNAME:PASSWORD -d @./test.json -H "Content-Type: application/json" -X PUT 'https://example.com/myfile.json'

Мне интересно, как я могу добавить содержимое файла в свой файл JSON с помощью jq, если это возможно?


person ruairi1244    schedule 09.03.2017    source источник


Ответы (1)


Ключом к простому решению jq здесь является чтение необработанного текстового файла с помощью «jq -R -s» и чтение JSON с использованием одного из параметров в семействе --arg. Здесь я буду использовать --argfile для простоты и надежности в разных версиях jq, но обратите внимание, что в документации сказано, что он устарел.

Со следующей программой jq в файле, скажем, program.jq:

. as $file
| $json
| (.content = $file + "\n" + .content)

и следующий текст в файле contents.txt:

Line 1 of contents.txt;
line 2.

и следующий JSON в curl.json:

{
  "content": "My JSON content",
  "owner": "etc"
}

вызов:

jq -R -s --argfile json curl.json -f program.jq contents.txt

производит:

{
  "content": "Line 1 of contents.txt;\nline 2.\n\nMy JSON content",
  "owner": "etc"
}

Если вы используете bash, вместо помещения вывода curl в файл вы можете использовать: --argfile json ‹(curl ....)

person peak    schedule 09.03.2017
comment
Спасибо за пик быстрого ответа, все работает отлично :) - person ruairi1244; 10.03.2017
comment
Я передал вывод в файл, используя jq -R -s --argfile json curl.json -f program.jq contents.txt > newfile.json - person ruairi1244; 10.03.2017