ruairi1244
ruairi1244

Reputation: 33

jq add file contents into json and update

I'm trying to use take a JSON object from a REST API GET call, then add the contents of a raw file (.md file in this case) into it using jq, before updating the same object using a PUT call.

I'm using the following to GET the file and write it locally:

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

The format of the JSON file is as follows:

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

I'd like to add the content of the raw file into content, so the result is as follows:

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

and then update the original JSON using a PUT call:

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

I'm wondering how I can add the file content into my JSON file like that using jq, if it is possible?

Upvotes: 3

Views: 2760

Answers (1)

peak
peak

Reputation: 116957

The key to a simple jq solution here is to read the raw text file using 'jq -R -s', and to read the JSON using one of the options in the --arg family. Here, I'll use --argfile for simplicity and robustness across jq versions, but please note that the documentation says it is deprecated.

With the following jq program in a file, say program.jq:

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

and the following text in the file contents.txt:

Line 1 of contents.txt;
line 2.

and the following JSON in curl.json:

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

the invocation:

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

produces:

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

If using bash, instead of putting the curl output into a file, you could use: --argfile json <(curl ....)

Upvotes: 3

Related Questions