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 Java

How to Convert JSON to CSV in Java

Converting JSON data to CSV is a common requirement in many applications, such as data exchange, reporting, and analytics. 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 guide, we will explore how to convert JSON to CSV in Java, including a quick example, a step-by-step breakdown, handling edge cases, common mistakes, performance tips, and frequently asked questions.

Quick Example

Here is a minimal, copy-pasteable code example that converts a JSON string to a CSV string:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.opencsv.CSVWriter;

import java.io.StringWriter;

public class JsonToCsv {
    public static void main(String[] args) throws Exception {
        String jsonString = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
        JsonNode jsonNode = new ObjectMapper().readTree(jsonString);
        StringWriter writer = new StringWriter();
        CSVWriter csvWriter = new CSVWriter(writer);
        csvWriter.writeNext(new String[] {jsonNode.get("name").asText(), jsonNode.get("age").asText(), jsonNode.get("city").asText()});
        System.out.println(writer.toString());
    }
}

This example uses the Jackson library to parse the JSON string and the OpenCSV library to write the CSV data. You can install these libraries using the following Maven dependencies:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>
<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.5.2</version>
</dependency>

Step-by-Step Breakdown

Let's walk through the code line by line:

  1. We import the necessary classes: JsonNode and ObjectMapper from Jackson, and CSVWriter from OpenCSV.
  2. We define a main method to test the conversion.
  3. We create a JSON string and parse it into a JsonNode object using ObjectMapper.
  4. We create a StringWriter to write the CSV data to a string.
  5. We create a CSVWriter object and pass the StringWriter to it.
  6. We write the CSV data using the writeNext method, passing an array of strings containing the values from the JSON object.
  7. We print the resulting CSV string to the console.

Handling Edge Cases

Here are some common edge cases to consider:

Empty/Null Input

If the input JSON string is empty or null, we should handle it accordingly:

if (jsonString == null || jsonString.isEmpty()) {
    System.out.println("Input is empty or null");
    return;
}

Invalid Input

If the input JSON string is invalid, we should catch the JsonParseException exception:

try {
    JsonNode jsonNode = new ObjectMapper().readTree(jsonString);
} catch (JsonParseException e) {
    System.out.println("Invalid JSON input");
    return;
}

Large Input

If the input JSON string is very large, we may need to consider streaming the data instead of loading it into memory:

JsonParser parser = new ObjectMapper().createParser(jsonString);
while (parser.nextToken() != JsonToken.END_OBJECT) {
    // process the data in chunks
}

Unicode/Special Characters

If the input JSON string contains Unicode or special characters, we should ensure that the CSV writer is configured to handle them correctly:

CSVWriter csvWriter = new CSVWriter(writer, ',', '"', '\\', true);

Common Mistakes

Here are some common mistakes developers make when converting JSON to CSV in Java:

Mistake 1: Using toString() instead of asText()

Using toString() instead of asText() can result in incorrect formatting:

// wrong
csvWriter.writeNext(new String[] {jsonNode.get("name").toString()});

// correct
csvWriter.writeNext(new String[] {jsonNode.get("name").asText()});

Mistake 2: Not handling edge cases

Not handling edge cases such as empty or invalid input can result in unexpected behavior:

// wrong
JsonNode jsonNode = new ObjectMapper().readTree(jsonString);

// correct
try {
    JsonNode jsonNode = new ObjectMapper().readTree(jsonString);
} catch (JsonParseException e) {
    System.out.println("Invalid JSON input");
    return;
}

Mistake 3: Not configuring the CSV writer correctly

Not configuring the CSV writer correctly can result in incorrect formatting:

// wrong
CSVWriter csvWriter = new CSVWriter(writer);

// correct
CSVWriter csvWriter = new CSVWriter(writer, ',', '"', '\\', true);

Performance Tips

Here are some performance tips to consider when converting JSON to CSV in Java:

Tip 1: Use streaming instead of loading into memory

Streaming the data instead of loading it into memory can improve performance for large input:

JsonParser parser = new ObjectMapper().createParser(jsonString);
while (parser.nextToken() != JsonToken.END_OBJECT) {
    // process the data in chunks
}

Tip 2: Use a buffer for writing CSV data

Using a buffer for writing CSV data can improve performance:

BufferedWriter writer = new BufferedWriter(new FileWriter("output.csv"));
CSVWriter csvWriter = new CSVWriter(writer);

Tip 3: Use multi-threading for parallel processing

Using multi-threading for parallel processing can improve performance for large input:

ExecutorService executor = Executors.newFixedThreadPool(5);
List<Future<?>> futures = new ArrayList<>();
for (int i = 0; i < 5; i++) {
    futures.add(executor.submit(new JsonToCsvTask(jsonString)));
}

FAQ

Q: What is the difference between toString() and asText()?

A: toString() returns a string representation of the JSON value, while asText() returns the JSON value as a string, without quotes or escaping.

Q: How do I handle Unicode characters in the input JSON string?

A: You can configure the CSV writer to handle Unicode characters by setting the escapeChar and quoteChar properties.

Q: How do I improve performance for large input JSON strings?

A: You can improve performance by streaming the data instead of loading it into memory, using a buffer for writing CSV data, and using multi-threading for parallel processing.

Q: What is the best way to handle edge cases such as empty or invalid input?

A: You can handle edge cases by checking for empty or null input, catching exceptions, and configuring the CSV writer to handle errors.

Q: Can I use this code for converting JSON to CSV in a web application?

A: Yes, you can use this code in a web application, but you may need to consider additional factors such as security, scalability, and performance.

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