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>
これを解決するには、カスタム アンマーシャラーが必要です。
環境用のカスタム アンマーシャラー
静的キーと動的キーの両方を解析する、Environment タイプのカスタム 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>
修正された解析と出力
これで、解析コードを変更して動的キーを処理し、最終的に目的のデータ構造を返すことができます。
変更された Main 関数
<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 中国語 Web サイトの他の関連記事を参照してください。