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

How to Format JSON in Rust

How to format JSON in Rust

=====================================

Formatting JSON data is an essential task in many applications, and Rust provides a robust ecosystem for working with JSON. In this guide, we will explore how to format JSON in Rust, covering the basics, common use cases, edge cases, and performance tips.

Quick Example


Here is a minimal example of how to format JSON in Rust using the popular serde_json crate:

use serde_json::json;

fn main() {
    let data = json!({
        "name": "John",
        "age": 30,
        "city": "New York"
    });

    let formatted_json = serde_json::to_string_pretty(&data).unwrap();

    println!("{}", formatted_json);
}

This code creates a JSON object using the json! macro, and then uses the to_string_pretty function to format the JSON data with indentation and newlines.

Step-by-Step Breakdown


Let's walk through the code line by line:

  • use serde_json::json;: We import the json! macro from the serde_json crate, which allows us to create JSON objects in a concise way.
  • fn main() { ... }: We define the main function, which is the entry point of the program.
  • let data = json!({ ... });: We create a JSON object using the json! macro, specifying the key-value pairs that make up the object.
  • let formatted_json = serde_json::to_string_pretty(&data).unwrap();: We use the to_string_pretty function to format the JSON data with indentation and newlines. The unwrap method is used to handle any errors that might occur during formatting.
  • println!("{}", formatted_json);: We print the formatted JSON data to the console.

Handling Edge Cases


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

Empty/null input

If the input JSON data is empty or null, we can handle it by checking for these cases before formatting:

let data = json!({});

if data.is_null() || data.is_empty() {
    println!("Input JSON is empty or null");
} else {
    let formatted_json = serde_json::to_string_pretty(&data).unwrap();
    println!("{}", formatted_json);
}

Invalid input

If the input JSON data is invalid, we can handle it by using the Result type and checking for errors:

let data = json!({ invalid: "json" });

match serde_json::to_string_pretty(&data) {
    Ok(formatted_json) => println!("{}", formatted_json),
    Err(err) => println!("Error formatting JSON: {}", err),
}

Large input

If the input JSON data is very large, we can handle it by using a streaming JSON writer:

use serde_json::Serializer;

let data = json!({
    "large": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
});

let mut writer = Vec::new();
let mut serializer = Serializer::new(&mut writer);

serializer.serialize_json(&data).unwrap();

let formatted_json = String::from_utf8(writer).unwrap();
println!("{}", formatted_json);

Unicode/special characters

If the input JSON data contains Unicode or special characters, we can handle it by using the serde_json::to_string_pretty function with the pretty feature enabled:

let data = json!({
    "name": "John \u{1F600}",
    "age": 30
});

let formatted_json = serde_json::to_string_pretty(&data).unwrap();
println!("{}", formatted_json);

Common Mistakes


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

Wrong code

let data = json!({ "name": "John" });
let formatted_json = serde_json::to_string(&data).unwrap();
println!("{}", formatted_json);

Corrected code

let data = json!({ "name": "John" });
let formatted_json = serde_json::to_string_pretty(&data).unwrap();
println!("{}", formatted_json);

The mistake is using to_string instead of to_string_pretty to format the JSON data.

Wrong code

let data = json!({ "name": "John" });
let formatted_json = serde_json::to_string_pretty(&data);
println!("{}", formatted_json);

Corrected code

let data = json!({ "name": "John" });
let formatted_json = serde_json::to_string_pretty(&data).unwrap();
println!("{}", formatted_json);

The mistake is not handling the Result type returned by to_string_pretty.

Wrong code

let data = json!({ "name": "John" });
let formatted_json = serde_json::to_string_pretty(&data).unwrap();
println!("{}", formatted_json);

Corrected code

let data = json!({ "name": "John" });
match serde_json::to_string_pretty(&data) {
    Ok(formatted_json) => println!("{}", formatted_json),
    Err(err) => println!("Error formatting JSON: {}", err),
}

The mistake is not handling the error case when formatting the JSON data.

Performance Tips


Here are some performance tips for formatting JSON in Rust:

  • Use the to_string_pretty function with the pretty feature enabled to format JSON data with indentation and newlines.
  • Use a streaming JSON writer to handle large input JSON data.
  • Avoid using to_string instead of to_string_pretty to format JSON data, as it can result in slower performance.

FAQ


Q: What is the difference between to_string and to_string_pretty?

A: to_string returns a compact, single-line representation of the JSON data, while to_string_pretty returns a formatted representation with indentation and newlines.

Q: How do I handle errors when formatting JSON data?

A: Use the Result type and check for errors using match or unwrap.

Q: Can I use serde_json to format JSON data with custom indentation?

A: Yes, you can use the to_string_pretty function with the pretty feature enabled and specify a custom indentation level.

Q: How do I handle large input JSON data?

A: Use a streaming JSON writer to handle large input JSON data.

Q: Can I use serde_json to format JSON data with Unicode or special characters?

A: Yes, serde_json supports formatting JSON data with Unicode or special characters.

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