ghodss/yaml

GitHub: ghodss/yaml

该库通过对 go-yaml 的封装,让 Go 开发者能够复用 JSON struct tag 和自定义 JSON 方法来处理 YAML 的序列化与反序列化。

Stars: 1063 | Forks: 236

# Go 的 YAML 序列化与反序列化支持 [![Build Status](https://travis-ci.org/ghodss/yaml.svg)](https://travis-ci.org/ghodss/yaml) ## 简介 这是一个 [go-yaml](https://github.com/go-yaml/yaml) 的封装库,旨在提供一种更好的方式来处理 struct 的 YAML 序列化和反序列化。 简而言之,该库首先使用 go-yaml 将 YAML 转换为 JSON,然后使用 `json.Marshal` 和 `json.Unmarshal` 来与 struct 进行转换。这意味着与 go-yaml 不同,它有效地复用了 JSON struct tags 以及自定义的 JSON 方法 `MarshalJSON` 和 `UnmarshalJSON`。有关此方法背后原理的详细概述,[请参阅此博客文章](https://web.archive.org/web/20150812020634/http://ghodss.com/2014/the-right-way-to-handle-yaml-in-golang/)。 ## 兼容性 本包使用 [go-yaml](https://github.com/go-yaml/yaml),因此支持 [go-yaml 所支持的一切](https://github.com/go-yaml/yaml#compatibility)。 ## 注意事项 **注意事项 #1:** 当使用 `yaml.Marshal` 和 `yaml.Unmarshal` 时,二进制数据不应带有 `!!binary` YAML 标签。如果你这样做了,go-yaml 会将二进制数据从 base64 转换为原始二进制数据,这与 JSON 不兼容。不过,你仍然可以在你的 YAML 文件中使用二进制数据——只需在没有 `!!binary` 标签的情况下存储它们,并在你的代码中(例如在自定义的 JSON 方法 `MarshalJSON` 和 `UnmarshalJSON` 中)解码 base64 即可。这还有一个好处,即你的 YAML 和 JSON 二进制数据将以完全相同的方式解码。例如: ``` BAD: exampleKey: !!binary gIGC GOOD: exampleKey: gIGC ... and decode the base64 data in your code. ``` **注意事项 #2:** 当直接使用 `YAMLToJSON` 时,以 map 为键的 map 会导致错误,因为 JSON 不支持这种方式。这个错误也会在 `Unmarshal` 中发生,因为 struct 字段不能作为键,所以无论如何你也无法反序列化 map 键。 ## 安装与使用 要安装,请运行: ``` $ go get github.com/ghodss/yaml ``` 并使用以下方式导入: ``` import "github.com/ghodss/yaml" ``` 用法与 JSON 库非常相似: ``` package main import ( "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` 和 `yaml.JSONToYAML` 方法也可用: ``` package main import ( "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"} */ } ```
标签:EVTX分析, Golang, Homebrew安装, YAML, 安全库, 安全编程, 序列化, 开发库, 数据格式转换, 日志审计