bumping go.uber.org/zap c8e813e...eaeb0fc: > eaeb0fc Preparing release v1.19.1 (# 1005) > 0944a26 Update changelog (# 1004) > 305c249 json: Fix float32 encoding and add test (# 1003) > 914c4ff json: Fix encoding complex with negative i (# 1001) > d8fd848 Fixes multiple CVE from imports (# 990) bumping knative.dev/pkg 5ae4821...2267a4c: > 2267a4c Bump a few assorted deps (# 2301) > 221312a duck cronjob (# 2299) > f07c8e4 Add pod / cronjob (# 2298) > 07ea512 Update very old Google API dependencies (# 2294) > 55de825 Update actions (# 2296) > c92466a Update community files (# 2295) > b708bde Bump a few assorted dependencies (# 2292) > 7d6d325 Update actions (# 2287) > 61a3edd Add IsNum to true when set `-0` to minimumVersion.Pre (# 2288) > c5ec096 Update community files (# 2286) > 52b0e29 Source validation fixes (# 2285) > d8349b0 Update community files (# 2284) Signed-off-by: Knative Automation <automation@knative.team> |
||
|---|---|---|
| .. | ||
| .gitignore | ||
| .travis.yml | ||
| CONTRIBUTING.md | ||
| LICENSE | ||
| README.md | ||
| RELEASE.md | ||
| SECURITY_CONTACTS | ||
| code-of-conduct.md | ||
| fields.go | ||
| go.mod | ||
| go.sum | ||
| yaml.go | ||
| yaml_go110.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"}
*/
}