Try it yourself with our free Json To Csv tool — runs entirely in your browser, no signup needed.

How to Convert JSON to CSV in Bash

How to convert JSON to CSV in Bash

Converting JSON data to CSV is a common task in data processing and analysis. JSON (JavaScript Object Notation) is a lightweight data interchange format, while CSV (Comma Separated Values) is a widely-used format for tabular data. In this article, we will explore how to convert JSON to CSV in Bash, a popular Unix shell scripting language. This guide is designed to be practical and comprehensive, covering common use cases, edge cases, and performance tips.

Quick Example

#!/bin/bash

# Install jq, a lightweight JSON processor
apt-get install jq

# Sample JSON data
json_data='[
  {"name": "John", "age": 30},
  {"name": "Jane", "age": 25}
]'

# Convert JSON to CSV using jq
echo "$json_data" | jq -r '.[] | @csv' > output.csv

This code example uses jq to parse the JSON data and convert it to CSV. The @csv filter is used to format the output as CSV.

Step-by-Step Breakdown

Let's walk through the code line by line:

  • #!/bin/bash: This line specifies the interpreter that should be used to run the script.
  • apt-get install jq: This line installs jq, a lightweight JSON processor. If you already have jq installed, you can skip this line.
  • json_data='[...]: This line defines a sample JSON data string.
  • echo "$json_data" | jq -r '.[] | @csv' > output.csv: This line pipes the JSON data to jq, which parses the data and converts it to CSV using the @csv filter. The -r option tells jq to output the result as a raw string, without quotes. The output is redirected to a file named output.csv.

Handling Edge Cases

Empty/Null Input

If the input JSON data is empty or null, jq will output an error message. To handle this case, you can add a simple check:

if [ -z "$json_data" ]; then
  echo "Error: Input data is empty or null"
  exit 1
fi

Invalid Input

If the input JSON data is invalid, jq will output an error message. To handle this case, you can use the jq option --exit-status to exit the script with a non-zero status code:

if ! echo "$json_data" | jq -r '.[] | @csv' > output.csv; then
  echo "Error: Invalid input data"
  exit 1
fi

Large Input

If the input JSON data is very large, jq may consume a lot of memory. To handle this case, you can use the jq option --stream to process the input data in chunks:

echo "$json_data" | jq -r '.[] | @csv' --stream > output.csv

Unicode/Special Characters

If the input JSON data contains Unicode or special characters, jq may output incorrect results. To handle this case, you can use the jq option --unicode-output to output the results in Unicode:

echo "$json_data" | jq -r '.[] | @csv' --unicode-output > output.csv

Common Mistakes

  • Mistake 1: Not installing jq
# Wrong code
echo "$json_data" | jq -r '.[] | @csv' > output.csv

# Corrected code
apt-get install jq
echo "$json_data" | jq -r '.[] | @csv' > output.csv
  • Mistake 2: Not checking for empty/null input
# Wrong code
echo "$json_data" | jq -r '.[] | @csv' > output.csv

# Corrected code
if [ -z "$json_data" ]; then
  echo "Error: Input data is empty or null"
  exit 1
fi
echo "$json_data" | jq -r '.[] | @csv' > output.csv
  • Mistake 3: Not handling invalid input
# Wrong code
echo "$json_data" | jq -r '.[] | @csv' > output.csv

# Corrected code
if ! echo "$json_data" | jq -r '.[] | @csv' > output.csv; then
  echo "Error: Invalid input data"
  exit 1
fi

Performance Tips

  • Tip 1: Use jq with the --stream option
echo "$json_data" | jq -r '.[] | @csv' --stream > output.csv

This option allows jq to process the input data in chunks, reducing memory usage.

  • Tip 2: Use jq with the --compact-output option
echo "$json_data" | jq -r '.[] | @csv' --compact-output > output.csv

This option tells jq to output the results in a compact format, reducing the size of the output file.

  • Tip 3: Use a faster JSON parser
echo "$json_data" | json2csv > output.csv

json2csv is a faster JSON parser that can be used as an alternative to jq.

FAQ

Q: What is the best way to convert JSON to CSV in Bash?

A: The best way to convert JSON to CSV in Bash is to use jq, a lightweight JSON processor.

Q: How do I handle empty/null input data?

A: You can add a simple check to handle empty/null input data.

Q: How do I handle invalid input data?

A: You can use the jq option --exit-status to exit the script with a non-zero status code.

Q: How do I handle large input data?

A: You can use the jq option --stream to process the input data in chunks.

Q: How do I handle Unicode/special characters in the input data?

A: You can use the jq option --unicode-output to output the results in Unicode.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp