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

How to Convert YAML to JSON in Go

How to convert YAML to JSON in Go

Converting YAML to JSON is a common task in many applications, especially when working with configuration files or data exchange formats. YAML and JSON are both popular data serialization formats, but they have different use cases and advantages. In this article, we will explore how to convert YAML to JSON in Go, a popular programming language known for its simplicity and performance.

Quick Example

Here is a minimal example that converts a YAML string to JSON:

package main

import (
	"encoding/json"
	"gopkg.in/yaml.v3"
	"fmt"
)

func main() {
	yamlStr := `
name: John Doe
age: 30
`

	var data map[string]interface{}
	err := yaml.Unmarshal([]byte(yamlStr), &data)
	if err != nil {
		fmt.Println(err)
		return
	}

	jsonBytes, err := json.Marshal(data)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(string(jsonBytes))
}

This code uses the gopkg.in/yaml.v3 package to unmarshal the YAML string into a Go map, and then uses the encoding/json package to marshal the map into a JSON string.

Step-by-Step Breakdown

Let's walk through the code line by line:

  • import "gopkg.in/yaml.v3": We import the gopkg.in/yaml.v3 package, which provides a YAML parser.
  • import "encoding/json": We import the encoding/json package, which provides a JSON parser.
  • `yamlStr := "...": We define a YAML string that we want to convert to JSON.
  • var data map[string]interface{}: We define a Go map to store the unmarshaled YAML data.
  • err := yaml.Unmarshal([]byte(yamlStr), &data): We use the yaml.Unmarshal function to unmarshal the YAML string into the Go map. We pass the YAML string as a byte slice, and a pointer to the map as the second argument.
  • if err != nil { ... }: We check if there was an error during unmarshaling, and if so, we print the error and return.
  • jsonBytes, err := json.Marshal(data): We use the json.Marshal function to marshal the Go map into a JSON string. We pass the map as the first argument, and a pointer to an error variable as the second argument.
  • if err != nil { ... }: We check if there was an error during marshaling, and if so, we print the error and return.
  • fmt.Println(string(jsonBytes)): We print the JSON string to the console.

Handling Edge Cases

Here are some common edge cases to consider:

Empty/null input

If the input YAML string is empty or null, the yaml.Unmarshal function will return an error. We can handle this case by checking for an error after unmarshaling:

if err != nil {
	if err == yaml.ErrEmptyDocument {
		fmt.Println("Input YAML is empty")
		return
	}
	// handle other errors
}

Invalid input

If the input YAML string is invalid, the yaml.Unmarshal function will return an error. We can handle this case by checking for an error after unmarshaling:

if err != nil {
	if err.Error() == "yaml: unmarshal errors:" {
		fmt.Println("Input YAML is invalid")
		return
	}
	// handle other errors
}

Large input

If the input YAML string is very large, the yaml.Unmarshal function may use a lot of memory. We can handle this case by using a streaming YAML parser, such as the yaml.NewDecoder function:

dec := yaml.NewDecoder(strings.NewReader(yamlStr))
var data map[string]interface{}
err := dec.Decode(&data)
if err != nil {
	// handle error
}

Unicode/special characters

If the input YAML string contains Unicode or special characters, the json.Marshal function may not be able to handle them correctly. We can handle this case by using the json.MarshalIndent function with the UseNumber option:

jsonBytes, err := json.MarshalIndent(data, "", "\t", json.UseNumber)
if err != nil {
	// handle error
}

Common Mistakes

Here are some common mistakes developers make when converting YAML to JSON in Go:

Mistake 1: Not checking for errors

// wrong
yaml.Unmarshal([]byte(yamlStr), &data)
jsonBytes, _ := json.Marshal(data)

// correct
err := yaml.Unmarshal([]byte(yamlStr), &data)
if err != nil {
	// handle error
}
jsonBytes, err := json.Marshal(data)
if err != nil {
	// handle error
}

Mistake 2: Not handling edge cases

// wrong
err := yaml.Unmarshal([]byte(yamlStr), &data)
if err != nil {
	// handle error
}

// correct
err := yaml.Unmarshal([]byte(yamlStr), &data)
if err != nil {
	if err == yaml.ErrEmptyDocument {
		fmt.Println("Input YAML is empty")
		return
	}
	// handle other errors
}

Mistake 3: Not using the correct encoding

// wrong
jsonBytes, err := json.Marshal(data)

// correct
jsonBytes, err := json.MarshalIndent(data, "", "\t", json.UseNumber)

Performance Tips

Here are some performance tips for converting YAML to JSON in Go:

  • Use a streaming YAML parser, such as the yaml.NewDecoder function, for large input YAML strings.
  • Use the json.MarshalIndent function with the UseNumber option to handle Unicode and special characters correctly.
  • Use the encoding/json package's Compact option to reduce the size of the output JSON string.

FAQ

Q: What is the difference between YAML and JSON?

A: YAML and JSON are both data serialization formats, but YAML is more human-readable and flexible, while JSON is more compact and machine-readable.

Q: How do I handle errors when converting YAML to JSON?

A: You can handle errors by checking for errors after unmarshaling and marshaling, and by using error-handling functions such as yaml.ErrEmptyDocument.

Q: How do I handle large input YAML strings?

A: You can handle large input YAML strings by using a streaming YAML parser, such as the yaml.NewDecoder function.

Q: How do I handle Unicode and special characters in the output JSON string?

A: You can handle Unicode and special characters by using the json.MarshalIndent function with the UseNumber option.

Q: What is the best way to optimize the performance of YAML to JSON conversion?

A: You can optimize the performance of YAML to JSON conversion by using a streaming YAML parser, using the encoding/json package's Compact option, and handling errors correctly.

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