Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ghodss/yaml
A better way to marshal and unmarshal YAML in Golang
https://github.com/ghodss/yaml
Last synced: 24 days ago
JSON representation
A better way to marshal and unmarshal YAML in Golang
- Host: GitHub
- URL: https://github.com/ghodss/yaml
- Owner: ghodss
- License: other
- Created: 2014-12-01T02:37:07.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2023-05-26T03:22:30.000Z (over 1 year ago)
- Last Synced: 2024-10-13T23:09:01.146Z (26 days ago)
- Language: Go
- Size: 43.9 KB
- Stars: 1,038
- Watchers: 16
- Forks: 226
- Open Issues: 35
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- go-awesome - ghodss/yaml
- awesome - yaml - A better way to marshal and unmarshal YAML in Golang (Go)
README
# YAML marshaling and unmarshaling support for Go
[![Build Status](https://travis-ci.org/ghodss/yaml.svg)](https://travis-ci.org/ghodss/yaml)
## Introduction
A wrapper around [go-yaml](https://github.com/go-yaml/yaml) designed to enable a better way of handling YAML when marshaling to and from structs.
In short, this library first converts YAML to JSON using go-yaml and then uses `json.Marshal` and `json.Unmarshal` to convert to or from the struct. This means that it effectively reuses the JSON struct tags as well as the custom JSON methods `MarshalJSON` and `UnmarshalJSON` unlike go-yaml. For a detailed overview of the rationale behind this method, [see this blog post](https://web.archive.org/web/20150812020634/http://ghodss.com/2014/the-right-way-to-handle-yaml-in-golang/).
## Compatibility
This package uses [go-yaml](https://github.com/go-yaml/yaml) and therefore supports [everything go-yaml supports](https://github.com/go-yaml/yaml#compatibility).
## Caveats
**Caveat #1:** When using `yaml.Marshal` and `yaml.Unmarshal`, binary data should NOT be preceded with the `!!binary` YAML tag. If you do, go-yaml will convert the binary data from base64 to native binary data, which is not compatible with JSON. You can still use binary in your YAML files though - just store them without the `!!binary` tag and decode the base64 in your code (e.g. in the custom JSON methods `MarshalJSON` and `UnmarshalJSON`). This also has the benefit that your YAML and your JSON binary data will be decoded exactly the same way. As an example:
```
BAD:
exampleKey: !!binary gIGCGOOD:
exampleKey: gIGC
... and decode the base64 data in your code.
```**Caveat #2:** When using `YAMLToJSON` directly, maps with keys that are maps will result in an error since this is not supported by JSON. This error will occur in `Unmarshal` as well since you can't unmarshal map keys anyways since struct fields can't be keys.
## Installation and usage
To install, run:
```
$ go get github.com/ghodss/yaml
```And import using:
```
import "github.com/ghodss/yaml"
```Usage is very similar to the JSON library:
```go
package mainimport (
"fmt""github.com/ghodss/yaml"
)type Person struct {
Name string `json:"name"` // Affects YAML field names too.
Age int `json:"age"`
}func main() {
// Marshal a Person struct to YAML.
p := Person{"John", 30}
y, err := yaml.Marshal(p)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Println(string(y))
/* Output:
age: 30
name: John
*/// Unmarshal the YAML back into a Person struct.
var p2 Person
err = yaml.Unmarshal(y, &p2)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Println(p2)
/* Output:
{John 30}
*/
}
````yaml.YAMLToJSON` and `yaml.JSONToYAML` methods are also available:
```go
package mainimport (
"fmt""github.com/ghodss/yaml"
)func main() {
j := []byte(`{"name": "John", "age": 30}`)
y, err := yaml.JSONToYAML(j)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Println(string(y))
/* Output:
name: John
age: 30
*/
j2, err := yaml.YAMLToJSON(y)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Println(string(j2))
/* Output:
{"age":30,"name":"John"}
*/
}
```