Files
linux.softwareshinobi.com/landing/docs/Bash-Scripts/018-working-with-json-in-bash-using-jq.md
Software Shinobi 7d9171c854
All checks were successful
learn org at code.softwareshinobi.com/linux.softwareshinobi.com/pipeline/head This commit looks good
reworking content
2025-06-19 10:03:08 -04:00

135 lines
4.0 KiB
Markdown

# Json Data
`jq` is your lightweight, flexible command-line JSON processor. It's built in portable C with zero runtime dependencies, making it simple to install and powerful for parsing JSON in Bash.
-----
### Demo Setup: QuizAPI
This demo uses the [QuizAPI](https://quizapi.io/) to fetch JSON data. Obtain a free **API key** from their [client area](https://quizapi.io/clientarea/settings/token) to follow along.
-----
### Installing `jq`
`jq` is easily installed via your system's package manager or direct download.
* **Ubuntu/Debian:** `sudo apt-get install jq`
* **Red Hat/Fedora:** `sudo dnf install jq`
* **Arch Linux:** `sudo pacman -S jq`
For other systems, refer to the [official `jq` download page](https://www.google.com/search?q=%5Bhttps://stedolan.github.io/jq/download/%5D\(https://stedolan.github.io/jq/download/\)). Verify your installation:
```bash
jq --version
```
-----
### Basic JSON Parsing with `jq`
Once `jq` is installed and you have your QuizAPI key, you can start processing JSON.
First, set your API key:
```bash
API_KEY=YOUR_API_KEY_HERE # Replace with your actual key
```
Fetch questions using `curl`:
```bash
curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10"
```
The raw output is hard to read. Pipe it to `jq` for beautifully formatted and colored JSON:
```bash
curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10" | jq
```
This command makes the JSON output structured and easy to inspect.
-----
### Extracting Specific Elements
To get only the first element from a JSON array, use `.[0]`:
```bash
curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10" | jq '.[0]'
```
This will output only the first JSON object in the array.
-----
### Fetching Key Values Across an Array
To extract the value of a specific key (e.g., `question`) from every object in a JSON array, use `.[].key`:
```bash
curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10" | jq '.[].question'
```
This will return a list of all questions from the API response.
-----
### Integrating `jq` into a Bash Script
Let's create a script to fetch a question and its answers, then display them. We'll use `jq` to parse specific fields and assign them to Bash variables.
Create `quiz_script.sh`:
```bash
touch quiz_script.sh
```
Open `quiz_script.sh` and add (remember to replace `YOUR_API_KEY_HERE`):
```bash
#!/usr/bin/env bash
# Your QuizAPI Key (replace YOUR_API_KEY_HERE with your actual key)
API_KEY="YOUR_API_KEY_HERE"
# Make an API call and get the first question object
# Using -s for silent mode to suppress curl's progress meter
QUIZ_DATA=$(curl -s "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=1" 2>/dev/null)
# Extract specific values using jq with raw output (-r) for Bash variables
question=$(echo "${QUIZ_DATA}" | jq -r '.[0].question')
answer_a=$(echo "${QUIZ_DATA}" | jq -r '.[0].answers.answer_a')
answer_b=$(echo "${QUIZ_DATA}" | jq -r '.[0].answers.answer_b')
answer_c=$(echo "${QUIZ_DATA}" | jq -r '.[0].answers.answer_c')
answer_d=$(echo "${QUIZ_DATA}" | jq -r '.[0].answers.answer_d')
# Output the question and answers
echo "
Question: ${question}
A) ${answer_a}
B) ${answer_b}
C) ${answer_c}
D) ${answer_d}
"
```
Save, make executable, and run:
```bash
chmod +x quiz_script.sh
./quiz_script.sh
```
The script will print a random question and its corresponding answers. For more advanced, interactive Bash quizzes, explore community projects that build upon these `jq` principles.
-----
### Conclusion
`jq` empowers you to process **JSON** directly within your Bash terminal, facilitating seamless interaction with **REST APIs**. For deeper dives, consult the [official `jq` manual](https://www.google.com/search?q=%5Bhttps://stedolan.github.io/jq/manual/%5D\(https://stedolan.github.io/jq/manual/\)) and the [QuizAPI documentation](https://quizapi.io/docs/1.0/overview).
> {notice} This content was inspired by a piece by softwareshinobi on Dev Team Six.