bumping sigs.k8s.io/yaml c3772b5...0f318dc: > 0f318dc Merge pull request # 134 from kubernetes-sigs/forgot-to-add-redirects-for-constants > 8eaa802 Merge pull request # 133 from kubernetes-sigs/deprecate-code-in-goyaml.v3-goyaml.v2-and-redirect > b8fc0c0 Forgot to add redirects for v3 constants > 0fe7da3 Merge pull request # 125 from kragniz/go-1.24 > 69e45c1 Deprecate code in goyaml.v2/goyaml.v3 directories and redirect > c6ac2c9 Merge pull request # 126 from kragniz/remove-travis > 14cbb88 Test against go 1.24.x > b9a9b1c Merge pull request # 106 from ThatsMrTalbot/patch-1 > 203ded9 Remove old travisci config file > 56d6720 Merge pull request # 122 from liggitt/unhashable-key > 4c6913f fix: wrap errors returned by JSON unmarshal > 119290a Merge pull request # 118 from skitt/drop-go1.10-build > 63d028e Handle unhashable keys during merge > 50e7f43 Merge pull request # 119 from skitt/test-go-1.21 > ea138a0 Merge Go 1.10+ files > 9934139 Test with Go 1.21 and later bumping knative.dev/pkg 05e18ff...4ec554b: > 4ec554b Bump sigs.k8s.io/yaml from 1.4.0 to 1.5.0 (# 3194) > 0285e29 group otel updates (# 3193) > fe85a65 drop unused functions in webhook testing (# 3191) > fd105c6 refactor webhook testing (# 3186) > fe477b7 drop cert-manager from downstream tests (# 3187) Signed-off-by: Knative Automation <automation@knative.team> |
||
|---|---|---|
| .. | ||
| goyaml.v2 | ||
| .gitignore | ||
| CONTRIBUTING.md | ||
| LICENSE | ||
| README.md | ||
| RELEASE.md | ||
| SECURITY_CONTACTS | ||
| code-of-conduct.md | ||
| fields.go | ||
| yaml.go | ||
README.md
YAML marshaling and unmarshaling support for Go
kubernetes-sigs/yaml is a permanent fork of ghodss/yaml.
Introduction
A wrapper around go-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.
Compatibility
This package uses go-yaml and therefore supports everything go-yaml supports.
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 gIGC
GOOD:
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 sigs.k8s.io/yaml
And import using:
import "sigs.k8s.io/yaml"
Usage is very similar to the JSON library:
package main
import (
"fmt"
"sigs.k8s.io/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:
package main
import (
"fmt"
"sigs.k8s.io/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:
age: 30
name: John
*/
j2, err := yaml.YAMLToJSON(y)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Println(string(j2))
/* Output:
{"age":30,"name":"John"}
*/
}