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

How to Convert JSON to YAML in Java

How to Convert JSON to YAML in Java

Converting JSON to YAML is a common requirement in many Java applications, especially when working with configuration files, data exchange, or API integrations. YAML is a human-readable serialization format that is often preferred over JSON for its readability and ease of use. In this article, we will explore how to convert JSON to YAML in Java, covering the basics, edge cases, common mistakes, and performance tips.

Quick Example

Here is a minimal example that converts a JSON string to YAML using the Jackson library:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;

public class JsonToYaml {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode jsonNode = objectMapper.readTree(json);
        YAMLMapper yamlMapper = new YAMLMapper();
        String yaml = yamlMapper.writeValueAsString(jsonNode);
        System.out.println(yaml);
    }
}

To use this code, add the following dependencies to your pom.xml file (if you're using Maven):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.12.3</version>
</dependency>

Or, if you're using Gradle, add these dependencies to your build.gradle file:

dependencies {
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3'
    implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.12.3'
}

Step-by-Step Breakdown

Let's walk through the code line by line:

  1. We import the necessary classes: JsonNode, ObjectMapper, and YAMLMapper.
  2. We create a JSON string that we want to convert to YAML.
  3. We create an ObjectMapper instance to parse the JSON string into a JsonNode object.
  4. We create a YAMLMapper instance to convert the JsonNode object to YAML.
  5. We use the writeValueAsString method to convert the JsonNode object to a YAML string.
  6. We print the resulting YAML string to the console.

Handling Edge Cases

Empty/Null Input

If the input JSON string is empty or null, the ObjectMapper will throw a JsonParseException. We can handle this by adding a null check and returning an empty YAML string:

if (json == null || json.isEmpty()) {
    return "";
}

Invalid Input

If the input JSON string is invalid, the ObjectMapper will throw a JsonParseException. We can handle this by wrapping the parsing code in a try-catch block:

try {
    JsonNode jsonNode = objectMapper.readTree(json);
    // ...
} catch (JsonParseException e) {
    // Handle invalid input
}

Large Input

If the input JSON string is very large, we may need to increase the buffer size of the ObjectMapper to avoid an OutOfMemoryError. We can do this by setting the JSON_NODE_FACTORY property:

objectMapper.setProperty(JsonNodeFactory.class, new JsonNodeFactory(true));

Unicode/Special Characters

If the input JSON string contains Unicode or special characters, we may need to configure the YAMLMapper to use a specific encoding. We can do this by setting the CHARSET property:

yamlMapper.setProperty(YAMLMapper.CHARSET, "UTF-8");

Common Mistakes

Mistake 1: Not Handling Null Input

Wrong code:

String yaml = yamlMapper.writeValueAsString(jsonNode);

Corrected code:

if (jsonNode != null) {
    String yaml = yamlMapper.writeValueAsString(jsonNode);
    // ...
}

Mistake 2: Not Handling Invalid Input

Wrong code:

JsonNode jsonNode = objectMapper.readTree(json);

Corrected code:

try {
    JsonNode jsonNode = objectMapper.readTree(json);
    // ...
} catch (JsonParseException e) {
    // Handle invalid input
}

Mistake 3: Not Configuring the YAMLMapper

Wrong code:

YAMLMapper yamlMapper = new YAMLMapper();

Corrected code:

YAMLMapper yamlMapper = new YAMLMapper();
yamlMapper.setProperty(YAMLMapper.CHARSET, "UTF-8");

Performance Tips

Tip 1: Use a Buffering YAMLMapper

By default, the YAMLMapper writes the YAML output directly to the output stream. This can be inefficient for large inputs. We can improve performance by using a buffering YAMLMapper:

YAMLMapper yamlMapper = new YAMLMapper();
yamlMapper.setProperty(YAMLMapper.BUFFER_SIZE, 1024 * 1024);

Tip 2: Use a Thread-Safe ObjectMapper

If we're using multiple threads to convert JSON to YAML, we should use a thread-safe ObjectMapper:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setProperty(JsonGenerator.Feature.INDENT_OUTPUT, true);

Tip 3: Avoid Creating Multiple YAMLMappers

Creating multiple YAMLMapper instances can be expensive. We should reuse a single instance whenever possible:

YAMLMapper yamlMapper = new YAMLMapper();
// Reuse yamlMapper instance

FAQ

Q: What is the difference between JSON and YAML?

A: JSON (JavaScript Object Notation) is a lightweight data interchange format, while YAML (YAML Ain't Markup Language) is a human-readable serialization format.

Q: Can I use this code for large JSON inputs?

A: Yes, but you may need to increase the buffer size of the ObjectMapper to avoid an OutOfMemoryError.

Q: How do I handle invalid input JSON?

A: You can wrap the parsing code in a try-catch block and handle the JsonParseException.

Q: Can I use this code for Unicode or special characters?

A: Yes, but you may need to configure the YAMLMapper to use a specific encoding.

Q: Is this code thread-safe?

A: No, but you can use a thread-safe ObjectMapper to make it thread-safe.

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