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 Dart

How to Convert JSON to CSV in Dart

Converting JSON data to CSV is a common task in data processing and analysis. JSON (JavaScript Object Notation) is a lightweight data interchange format that is widely used for exchanging data between web servers, web applications, and mobile apps. CSV (Comma Separated Values), on the other hand, is a plain text format that is widely used for tabular data. In this article, we will explore how to convert JSON to CSV in Dart, a modern programming language developed by Google.

Quick Example

Here is a minimal example of how to convert JSON to CSV in Dart:

import 'dart:convert';
import 'package:csv/csv.dart';

void main() {
  String jsonString = '''
  [
    {"name": "John", "age": 30},
    {"name": "Alice", "age": 25}
  ]
  ''';

  List<List<dynamic>> csvData = [];

  jsonDecode(jsonString).forEach((jsonObject) {
    csvData.add([jsonObject['name'], jsonObject['age']]);
  });

  String csvString = const ListToCsvConverter().convert(csvData);
  print(csvString);
}

This code assumes that you have the csv package installed. You can add it to your pubspec.yaml file:

dependencies:
  csv: ^5.0.1

Then run dart pub get to install the package.

Step-by-Step Breakdown

Let's walk through the code line by line:

  1. We import the dart:convert library, which provides functions for converting between different data formats.
  2. We import the csv package, which provides functions for working with CSV data.
  3. We define a JSON string containing an array of objects.
  4. We create an empty list to store the CSV data.
  5. We use jsonDecode to parse the JSON string into a list of objects.
  6. We iterate over the list of objects and extract the values for each object. We add these values to the csvData list as a sublist.
  7. We use ListToCsvConverter to convert the csvData list to a CSV string.
  8. We print the resulting CSV string.

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 this case to avoid errors:

void main() {
  String jsonString = null;

  if (jsonString == null || jsonString.isEmpty) {
    print('Input is empty or null');
    return;
  }

  // rest of the code
}

Invalid Input

If the input JSON string is invalid, jsonDecode will throw an exception. We can catch this exception and handle it accordingly:

void main() {
  String jsonString = 'Invalid JSON';

  try {
    jsonDecode(jsonString);
  } on FormatException catch (e) {
    print('Invalid JSON: $e');
    return;
  }

  // rest of the code
}

Large Input

If the input JSON string is very large, we may need to consider streaming the data instead of loading it all into memory at once. We can use the jsonDecodeStream function from the dart:convert library to achieve this:

void main() {
  String jsonString = '''
  [
    {"name": "John", "age": 30},
    {"name": "Alice", "age": 25},
    // ...
  ]
  ''';

  final jsonStream = jsonDecodeStream(jsonString);
  jsonStream.listen((jsonObject) {
    // process each object individually
  });
}

Unicode/Special Characters

If the input JSON string contains Unicode or special characters, we need to make sure that the CSV converter can handle these characters correctly. The csv package uses the UTF-8 encoding scheme by default, which supports Unicode characters.

Common Mistakes

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

Mistake 1: Not Handling Null Values

If the input JSON string contains null values, we need to handle these values correctly to avoid errors.

// wrong code
jsonDecode(jsonString).forEach((jsonObject) {
  csvData.add([jsonObject['name'], jsonObject['age']]);
});

// correct code
jsonDecode(jsonString).forEach((jsonObject) {
  csvData.add([jsonObject['name'] ?? '', jsonObject['age'] ?? '']);
});

Mistake 2: Not Handling Nested Objects

If the input JSON string contains nested objects, we need to handle these objects correctly to avoid errors.

// wrong code
jsonDecode(jsonString).forEach((jsonObject) {
  csvData.add([jsonObject['name'], jsonObject['address']['street']]);
});

// correct code
jsonDecode(jsonString).forEach((jsonObject) {
  csvData.add([jsonObject['name'], jsonObject['address']['street'] ?? '']);
});

Mistake 3: Not Using the Correct CSV Converter

We need to use the correct CSV converter to ensure that the output CSV string is in the correct format.

// wrong code
String csvString = csvData.join(',');

// correct code
String csvString = const ListToCsvConverter().convert(csvData);

Performance Tips

Here are some performance tips for converting JSON to CSV in Dart:

Tip 1: Use Streaming

If the input JSON string is very large, we can use streaming to improve performance.

void main() {
  String jsonString = '''
  [
    {"name": "John", "age": 30},
    {"name": "Alice", "age": 25},
    // ...
  ]
  ''';

  final jsonStream = jsonDecodeStream(jsonString);
  jsonStream.listen((jsonObject) {
    // process each object individually
  });
}

Tip 2: Use a Fast CSV Converter

We can use a fast CSV converter like ListToCsvConverter to improve performance.

void main() {
  String jsonString = '''
  [
    {"name": "John", "age": 30},
    {"name": "Alice", "age": 25}
  ]
  ''';

  List<List<dynamic>> csvData = [];

  jsonDecode(jsonString).forEach((jsonObject) {
    csvData.add([jsonObject['name'], jsonObject['age']]);
  });

  String csvString = const ListToCsvConverter().convert(csvData);
  print(csvString);
}

Tip 3: Avoid Creating Intermediate Lists

We can avoid creating intermediate lists to improve performance.

void main() {
  String jsonString = '''
  [
    {"name": "John", "age": 30},
    {"name": "Alice", "age": 25}
  ]
  ''';

  String csvString = '';
  jsonDecode(jsonString).forEach((jsonObject) {
    csvString += '${jsonObject['name']},${jsonObject['age']}\n';
  });
  print(csvString);
}

FAQ

Q: How do I handle nested objects in the input JSON string?

A: We can use the jsonDecode function to parse the JSON string into a list of objects, and then iterate over the list to extract the values.

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

A: The csv package uses the UTF-8 encoding scheme by default, which supports Unicode characters.

Q: How do I handle large input JSON strings?

A: We can use streaming to improve performance.

Q: How do I handle null values in the input JSON string?

A: We can use the null-aware operator ?? to handle null values.

Q: How do I improve performance when converting JSON to CSV?

A: We can use streaming, a fast CSV converter, and avoid creating intermediate lists to improve 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