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

How to Format JSON in C++

How to Format JSON in C++

Formatting JSON data in C++ is an essential task when working with JSON data, as it makes the data more human-readable and easier to debug. In this guide, we will explore how to format JSON in C++ using the popular nlohmann/json library.

Quick Example

Here is a minimal example that demonstrates how to format JSON in C++:

#include <nlohmann/json.hpp>

int main() {
    // Create a JSON object
    nlohmann::json json = {{"name", "John"}, {"age", 30}};

    // Format the JSON object
    std::string formattedJson = json.dump(4);

    // Print the formatted JSON
    std::cout << formattedJson << std::endl;

    return 0;
}

This code creates a JSON object, formats it with an indentation of 4 spaces, and prints the result to the console.

Step-by-Step Breakdown

Let's break down the code line by line:

  • #include <nlohmann/json.hpp>: This line includes the nlohmann/json library, which provides a JSON parser and formatter for C++.
  • nlohmann::json json = {{"name", "John"}, {"age", 30}};: This line creates a JSON object using the nlohmann/json library. The object has two key-value pairs: "name" with a value of "John" and "age" with a value of 30.
  • std::string formattedJson = json.dump(4);: This line formats the JSON object using the dump() function, which takes an integer argument specifying the indentation level. In this case, we use an indentation of 4 spaces.
  • std::cout << formattedJson << std::endl;: This line prints the formatted JSON to the console.

Handling Edge Cases

Here are some common edge cases to consider when formatting JSON in C++:

Empty/Null Input

When formatting an empty or null JSON object, the dump() function will return an empty string. To handle this case, you can add a simple check:

nlohmann::json json;
if (json.is_null()) {
    std::cout << "JSON object is null or empty" << std::endl;
} else {
    std::string formattedJson = json.dump(4);
    std::cout << formattedJson << std::endl;
}

Invalid Input

When formatting invalid JSON input, the dump() function will throw an exception. To handle this case, you can use a try-catch block:

try {
    nlohmann::json json = nlohmann::json::parse("Invalid JSON");
    std::string formattedJson = json.dump(4);
    std::cout << formattedJson << std::endl;
} catch (const nlohmann::json::parse_error& e) {
    std::cout << "Invalid JSON input: " << e.what() << std::endl;
}

Large Input

When formatting large JSON input, the dump() function may take a significant amount of time. To handle this case, you can use a streaming approach:

nlohmann::json json = nlohmann::json::parse("Large JSON input");
std::stringstream ss;
json.dump(ss, 4);
std::cout << ss.str() << std::endl;

Unicode/Special Characters

When formatting JSON input with Unicode or special characters, the dump() function will escape these characters correctly. For example:

nlohmann::json json = {{"name", "Jöhn"}};
std::string formattedJson = json.dump(4);
std::cout << formattedJson << std::endl;

This will output:

{
    "name": "J\u00f6hn"
}

Common Mistakes

Here are some common mistakes developers make when formatting JSON in C++:

Mistake 1: Using dump() without checking for null or empty input

nlohmann::json json;
std::string formattedJson = json.dump(4); // Will return an empty string

Corrected code:

nlohmann::json json;
if (json.is_null()) {
    std::cout << "JSON object is null or empty" << std::endl;
} else {
    std::string formattedJson = json.dump(4);
    std::cout << formattedJson << std::endl;
}

Mistake 2: Not handling invalid input

nlohmann::json json = nlohmann::json::parse("Invalid JSON");
std::string formattedJson = json.dump(4); // Will throw an exception

Corrected code:

try {
    nlohmann::json json = nlohmann::json::parse("Invalid JSON");
    std::string formattedJson = json.dump(4);
    std::cout << formattedJson << std::endl;
} catch (const nlohmann::json::parse_error& e) {
    std::cout << "Invalid JSON input: " << e.what() << std::endl;
}

Mistake 3: Not using a streaming approach for large input

nlohmann::json json = nlohmann::json::parse("Large JSON input");
std::string formattedJson = json.dump(4); // May take a significant amount of time

Corrected code:

nlohmann::json json = nlohmann::json::parse("Large JSON input");
std::stringstream ss;
json.dump(ss, 4);
std::cout << ss.str() << std::endl;

Performance Tips

Here are some performance tips for formatting JSON in C++:

  • Use a streaming approach for large input to avoid allocating a large string.
  • Use the dump() function with an indentation level of 0 to minimize the amount of memory allocated.
  • Avoid using the dump() function in a loop, as it can be slow. Instead, use a streaming approach or cache the formatted JSON.

FAQ

Q: How do I format JSON in C++?

A: You can use the nlohmann/json library to format JSON in C++.

Q: What is the best way to handle invalid JSON input?

A: You can use a try-catch block to catch the parse_error exception thrown by the nlohmann/json library.

Q: How do I format JSON with Unicode or special characters?

A: The nlohmann/json library will escape Unicode or special characters correctly when formatting JSON.

Q: What is the best way to handle large JSON input?

A: You can use a streaming approach to format large JSON input.

Q: Can I use the nlohmann/json library with C++11?

A: Yes, the nlohmann/json library is compatible with C++11.

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