135 lines
4.0 KiB
Markdown
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.
|