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

How to Format JSON in Dart

How to format JSON in Dart

When working with JSON data in Dart, it's often necessary to format it in a human-readable way, whether for debugging purposes or for displaying data to users. In this guide, we'll explore how to format JSON in Dart using the json package.

Quick Example

Here's a minimal example that formats a JSON string:

import 'package:json/json.dart';

void main() {
  final jsonString = '{"name":"John","age":30}';
  final jsonObject = jsonDecode(jsonString);
  final prettyJson = jsonEncode(jsonObject, toEncodable: (value) => _toPrettyJson(value));

  print(prettyJson);
}

dynamic _toPrettyJson(value) {
  if (value is Map) {
    return value.map((key, value) => MapEntry(key, _toPrettyJson(value)));
  } else if (value is List) {
    return value.map((value) => _toPrettyJson(value)).toList();
  }
  return value;
}

This code decodes a JSON string, formats it, and prints the result.

Step-by-Step Breakdown

Let's walk through the code:

  1. We import the json package, which provides functions for encoding and decoding JSON data.
  2. We define a JSON string jsonString and decode it into a Dart object using jsonDecode.
  3. We define a function _toPrettyJson that recursively formats the JSON object.
  4. We use jsonEncode to encode the formatted object back into a string, passing _toPrettyJson as the toEncodable callback.
  5. We print the formatted JSON string.

The _toPrettyJson function works by recursively traversing the JSON object, formatting each value as it goes. If the value is a map, it uses map to create a new map with formatted values. If the value is a list, it uses map to create a new list with formatted values.

Handling Edge Cases

Here are some common edge cases to consider:

Empty/Null Input

If the input JSON string is empty or null, jsonDecode will throw an exception. To handle this, you can add a simple null check:

if (jsonString == null || jsonString.isEmpty) {
  print('Invalid input');
  return;
}

Invalid Input

If the input JSON string is invalid, jsonDecode will throw a FormatException. To handle this, you can wrap the decoding in a try-catch block:

try {
  final jsonObject = jsonDecode(jsonString);
  // ...
} catch (e) {
  print('Invalid JSON: $e');
}

Large Input

If the input JSON string is very large, formatting it can be slow. To improve performance, you can use a streaming JSON parser like stream_json package.

Unicode/Special Characters

If the JSON data contains Unicode or special characters, make sure to use the utf8 encoding when decoding and encoding the JSON string:

final jsonString = '{"name":"John","age":30}';
final utf8JsonString = utf8.encode(jsonString);
final jsonObject = jsonDecode(utf8JsonString);

Common Mistakes

Here are some common mistakes to avoid:

Mistake 1: Forgetting to handle errors

// Wrong
final jsonObject = jsonDecode(jsonString);

Corrected code:

try {
  final jsonObject = jsonDecode(jsonString);
  // ...
} catch (e) {
  print('Invalid JSON: $e');
}

Mistake 2: Not handling null values

// Wrong
final prettyJson = jsonEncode(jsonObject);

Corrected code:

final prettyJson = jsonEncode(jsonObject, toEncodable: (value) => _toPrettyJson(value));

Mistake 3: Not using utf8 encoding

// Wrong
final jsonString = '{"name":"John","age":30}';

Corrected code:

final jsonString = '{"name":"John","age":30}';
final utf8JsonString = utf8.encode(jsonString);
final jsonObject = jsonDecode(utf8JsonString);

Performance Tips

Here are some performance tips for formatting JSON in Dart:

  1. Use a streaming JSON parser: For large JSON inputs, use a streaming JSON parser like stream_json package to improve performance.
  2. Use jsonEncode with toEncodable: Use jsonEncode with the toEncodable callback to format the JSON object in a single pass.
  3. Avoid unnecessary allocations: Avoid creating unnecessary objects or lists when formatting the JSON data.

FAQ

Q: What is the best way to format JSON in Dart?

A: Use the json package and jsonEncode with the toEncodable callback.

Q: How do I handle large JSON inputs?

A: Use a streaming JSON parser like stream_json package.

Q: What encoding should I use when decoding and encoding JSON?

A: Use utf8 encoding.

Q: How do I handle null values when formatting JSON?

A: Use the toEncodable callback to handle null values.

Q: What is the performance impact of formatting JSON in Dart?

A: The performance impact is minimal, but can be improved by using a streaming JSON parser and avoiding unnecessary allocations.

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