ghodss/yaml
GitHub: ghodss/yaml
该库通过对 go-yaml 的封装,让 Go 开发者能够复用 JSON struct tag 和自定义 JSON 方法来处理 YAML 的序列化与反序列化。
Stars: 1063 | Forks: 236
# Go 的 YAML 序列化与反序列化支持
[](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, 安全库, 安全编程, 序列化, 开发库, 数据格式转换, 日志审计