在 Go 中使用动态密钥解析 YAML
使用可能因用户定义的 API 版本而异的密钥解析 YAML 文件时会出现此问题。用户可以根据需要省略或安排版本(例如,V0、V2、V5)。
具有环境结构的原始方法
最初的方法是将 YAML 解析为环境结构。然而,解析数据的实际类型是map[string]Environment。
<code class="go">type Environment struct { SkipHeaderValidation bool `yaml:"skip-header-validation"` Version map[string]MajorVersion }</code>
要解决这个问题,我们需要一个自定义的Unmarshaler。
环境的自定义Unmarshaler
我们为环境类型创建一个自定义 Unmarshaler 方法,用于解析静态和动态键。
<code class="go">func (e *Environment) UnmarshalYAML(unmarshal func(interface{}) error) error { var params struct { SkipHeaderValidation bool `yaml:"skip-header-validation"` } if err := unmarshal(&params); err != nil { return err } var versions map[string]MajorVersion if err := unmarshal(&versions); err != nil { // Expect error here due to boolean to MajorVersion conversion if _, ok := err.(*yaml.TypeError); !ok { return err } } e.SkipHeaderValidation = params.SkipHeaderValidation e.Versions = versions return nil }</code>
修改的解析和输出
我们现在可以修改解析代码来处理动态键并最终返回所需的数据结构。
修改后的主函数
<code class="go">func main() { var e map[string]Environment if err := yaml.Unmarshal([]byte(data), &e); err != nil { fmt.Println(err.Error()) } fmt.Printf("%#v\n", e) }</code>
输出
输出现在将反映预期的数据结构,并相应解析动态键。
map[string]main.Environment{ "development": { SkipHeaderValidation: true, Versions: { "V2": { Current: "2.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: false, SkipMimeTypeValidation: false, }, "V1": { Current: "1.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: true, SkipMimeTypeValidation: true, }, }, }, }
以上是如何使用自定义解组器在 Go 中解析带有动态键的 YAML?的详细内容。更多信息请关注PHP中文网其他相关文章!