How to Convert a JSON Array into Bash Array [5 Methods]

LINUX
FUNDAMENTALS
A Complete Guide for Beginners Enroll Course Now

You can use the following methods to convert a JSON array into a Bash array:

  1. Using jq with command substitution: array=($(echo "$json_arr" | jq -r '.[]'))
  2. Using mapfile command: mapfile -t array < <(echo "$json_arr" | jq -r '.[]')
  3. Using readarray command: readarray -t array < <(echo "$json_arr" | jq -r '.[]')
  4. Using for loop: for item in $(echo "$json_arr" | jq -r '.[]'); do
    array+=("$item"); done

JSON (JavaScript Object Notation) is a powerful and lightweight tool that allows for the interchanging of data format that is easy for humans to read and for machines to parse using data structure formats such as arrays. Thus, the conversion of JSON arrays to Bash arrays might become a necessary step in processing and manipulating data within Bash scripts. This article will show 5 methods on how to convert JSON arrays to Bash arrays mentioning command and loop-based methods. It will also discuss challenges that may arise during the conversion operation with effective solutions.

1. Using the “jq” Command with Command Substitution

The jq command is a command line-based JSON data processor that is capable of extracting the elements from a JSON array and can be converted into a Bash array with command substitution. The full syntax is array=($(echo "$json_array" | jq -r '.[]')). Here’s an example:

#!/bin/bash
# the json array 
json_array='["item1", "item2", "item3"]'
#converting to bash array
bash_array=($(echo "$json_array" | jq -r '.[]'))

#print the array and length
echo "array: ${bash_array[@]}"
echo "length: ${#bash_array[@]}"
EXPLANATION

The above code first initializes a variable called json_array containing a JSON array as a string. Then echo "$json_array" prints the JSON array string and the output is piped to the “jq” command. The “jq” command extracts each array element (item1 item2 item3) and -r flag outputs them without the quotes. Finally, the command substitution method within the syntax bash_array=($(echo "$json_array" | jq -r '.[]')) extracts the elements into the bash_array which is evident after printing the elements of the Bash array using the echo command along with its length. 

bash json to aray using jq command

2.  Using the “mapfile” Command

The mapfile command is a powerful tool that allows reading lines from a standard input into an array variable. Here, the “mapfile” command can take a JSON array processed by the “jq” command as its input and convert it into an array variable. Here’s how:

#!/bin/bash
# the json array 
json_array='["item1", "item2", "item3"]'
#converting to bash array with mapfile and jq
mapfile -t bash_array < <(echo "$json_array" | jq -r '.[]')

#print the array and length
echo "array: ${bash_array[@]}"
echo "length: ${#bash_array[@]}"
EXPLANATION

In the above script, the code echo "$json_array" print the JSON array and jq -r '.[]' command extracts each element using the .[] filter. Then the mapfile command reads lines from its standard input (the output of the jq command in this case) to the array variable called bash_array. Finally, the echo command prints the array items and length to verify the conversion operation.

bash json to array with mapfile

3. Using the “readarray” Command

The readarray command is sometimes interchangeable with the mapfile command in Linux/Unix. It is an effective tool to take JSON array as input and convert it into a Bash array. Look at the following example to convert a JSON array into an array in Bash using the “readarray” command:

#!/bin/bash
# the json array 
json_array='["item1", "item2", "item3"]'

#converting to bash array with readarray and jq
readarray -t bash_array <<< "$(echo "$json_array" | jq -r '.[]')"

#print the array and length
echo "array: ${bash_array[@]}"
echo "length: ${#bash_array[@]}"
EXPLANATION

In the above script, the code echo "$json_array" print the JSON array and jq -r '.[]' command extracts each element using the .[] filter. Finally, the “readarray” command reads lines from its standard input (the output of the jq command in this case) to the array variable called bash_array which is seen after printing the array elements (item1 item2 item3) and its length (3) using the “echo” command.

readarray command to converts json array to bash array

4. Using the “read” Command with ‘jq’

The read command with the lightweight JSON processing tool “jq” can effectively convert a JSON array into a Bash array. Here’s an example:

#!/bin/bash
# the json array 
json_array='["hello", "world", "universe", "multiverse"]'

# declaring an empty bash array
bash_array=()
# read command to take json array items to bash array
while read -r item; do
    bash_array+=("$item")
done < <(echo "$json_array" | jq -r '.[]')
#print the array and length
echo "array: ${bash_array[@]}"
echo "length: ${#bash_array[@]}"
EXPLANATION

The above code initializes a JSON array and an empty bash array afterward. Then the read command with the while loop reads each line of input from the jq command output and assigns them to item variable. With each ongoing iteration, the items are appended to the bash_array which is evident after printing the array elements and length.

bash json to array with read command

5. Using “for” Loop

The Bash for loop can iteratively process the output of the “jq” command and convert the JSON array into a Bash array like the following example:

#!/bin/bash

# JSON array
json_array='["virat", "tamim", "ross"]'

# Initialize empty Bash array
declare -a bash_array

# Iterate over JSON array elements and append them to the Bash array
for item in $(echo "$json_array" | jq -r '.[]'); do
    bash_array+=("$item")
done
# Print Bash array elements and length
echo "array: ${bash_array[@]}"
echo "length: ${#bash_array[@]}"
EXPLANATION

The above code uses the loop for item in $(echo "$json_array" | jq -r '.[]') to iterate over each output of the “jq” command and appends them to a basha array using bash_array+=("$item") where the variable item represents each array item (virat tamim ross) with each ongoing iteration. Finally, after printing the bash_array elements including the array length, the success of the conversion operation is visible.

bash json to array with for loop

How to Read JSON Array from File to Convert into Bash Array

To read a JSON array from a file and convert it into a Bash array, just use the “jq” command which will parse the JSON data from the specified file and assign the parsed elements to an array in Bash.

Take the file data.json for example which contains a JSON array. To see the file content use the following command:

nano data.json

json array in file

Now, to convert the mentioned array in the file into a Bash array, see the example below:

#!/bin/bash

# Read JSON array from file and parse it into a Bash array
bash_array=($(jq -r '.[]' data.json))

# Print Bash array elements
echo "Bash array:"
for element in "${bash_array[@]}"; do
    echo "$element"
done
EXPLANATION

In the above code, the bash_array=($(jq -r '.[]' data.json)) command takes input from the file data.json (which is a JSON array) and extracts each element using the .[] flag and finally stores in the array-type variable bash_array. The “echo” command verifies this by displaying the array elements and the correct length.

json array from file converted into bash array

How to Solve “jq command not found” Error

In working with the JSON to Bash array conversion, one may encounter an issue where the jq command might not work as expected and the Bash script might throw an error like the following:jq command not found errorHere, the jq: command not found error occurs after executing the script due to its absence from the system.

Solution: Install the “jq” Command Using “sudo apt-get install”

The solution is very simple. Just install the jq command using the following line of code in the terminal:

sudo apt-get install jq

However, first, update the system using the sudo apt update to avoid unwanted behaviors:system updation before installation jq

Finally, you are good to go to install the “jq” command using sudo apt-get install jq like the image below:jq is being installed

Conclusion

JSON is a widely used data interchange format and is a necessary tool for modern software development and data processing tasks. This article discusses 5 useful methods of converting JSON array data structure to Bash array to facilitate working with Bash scripts that process JSON data. It mentions different commands like mapfile, readarray, and read to convert JSON arrays to arrays including iterative methods using for loop. It also discusses how to read an array from a file and convert it into a bash array along with mentioning potential challenges and their solutions while converting JSON arrays into Bash arrays.

People Also Ask

How to convert a JSON array into a Bash array?

To convert a JSON array into a Bash array, you can use the jq command line tool with process substitution with the syntax bash_array=($(echo "$json_array" | jq -r '.[]')). This parses the JSON array stored in the variable json_array and assigns each element to the bash_array.

How to install the jq command in my Ubuntu system?

To install the “jq” command in your Ubuntu system, open the terminal, and run the command sudo apt update first to update the system. Then run the command sudo apt-get install jq. This will install the jq command on your system. After installation, you can again update the system by running the sudo apt update command.

Can I access specific elements of JSON array in Bash?

To access any specific element of a JSON array in Bash, you can use the “jq” command to extract the element you want to access using indexing by employing the syntax echo “$json_array” | jq -r ‘.[index]’. For example, to access the first element from json_array='["item1", "item2", "item3"]', use the syntax echo "$json_array" | jq -r '.[0]'.

What does the jq command do in converting JSON arrays to Bash arrays?

The jq command extracts each element of the JSON array in converting such an array into Bash arrays by using the .[] notation within the full syntax echo "$json_array" | jq -r '.[]' and outputs the elements as separate lines. The -r option outputs strings without quotes to make them suitable for Bash array assignment.

What is the jq command in Linux?

The Linux “jq” command is a flexible and lightweight tool to process and manipulate JSON data directly using the command line or within the Bash scripts. With the “jq” command, it is possible to parse data easily, filter based on specific fields, and transform JSON objects and arrays efficiently to work.

What is a JSON array?

A JSON array is a data structure in JSON (JavaScript Object Notation) presenting an ordered collection of values. In a JSON array, the elements are enclosed within square brackets separated by commas. The elements can be of any various types such as strings, numbers, boolean, or even arrays.

Related Articles


<< Go Back to Array Operations in Bash | Bash Array | Bash Scripting Tutorial

Rate this post
Md Masrur Ul Alam

Assalamu Alaikum, I’m Md Masrur Ul Alam, currently working as a Linux OS Content Developer Executive at SOFTEKO. I completed my Bachelor's degree in Electronics and Communication Engineering (ECE)from Khulna University of Engineering & Technology (KUET). With an inquisitive mind, I have always had a keen eye for Science and Technolgy based research and education. I strongly hope this entity leverages the success of my effort in developing engaging yet seasoned content on Linux and contributing to the wealth of technical knowledge. Read Full Bio

Leave a Comment