Issue
I need your help to solve the following problem: I have a JSON file that looks like this:
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
how can I add and remove a new key (i.e "key4": "value4"
) by bash script?
I see also the issue to add or remove a comma at the end of last key in the file before adding or removing the new one.
Thank you
Solution
Your best bet is to use a JSON CLI such as jq
:
- On Debian-based systems such as Ubuntu, you can install it via
sudo apt-get install jq
- On macOS, with Homebrew (http://brew.sh/) installed, use
brew install jq
Examples, based on the following input string - output is to stdout
:
jsonStr='{ "key1": "value1", "key2": "value2", "key3": "value3" }'
Remove "key3":
jq 'del(.key3)' <<<"$jsonStr"
Add property "key4" with value "value4":
jq '. + { "key4": "value4" }' <<<"$jsonStr"
Change the value of existing property "key1" to "new-value1":
jq '.key1 = "new-value1"' <<<"$jsonStr"
A more robust alternative thanks, Lars Kiesow
:
If you pass the new value with --arg
, jq
takes care of properly escaping the value:
jq '.key1 = $newVal' --arg newVal '3 " of rain' <<<"$jsonStr"
If you want to update a JSON file in place (conceptually speaking), using the example of deleting "key3":
# Create test file.
echo '{ "key1": "value1", "key2": "value2", "key3": "value3" }' > test.json
# Remove "key3" and write results back to test.json (recreate it with result).
jq -c 'del(.key3)' test.json > tmp.$$.json && mv tmp.$$.json test.json
You cannot replace the input file directly, so the result is written to a temporary file that replaces the input file on success.
Note the -c
option, which produces compact rather than pretty-printed JSON.
For all options and commands, see the manual at http://stedolan.github.io/jq/manual/.
Answered By - mklement0 Answer Checked By - Timothy Miller (WPSolving Admin)