ホームページ >バックエンド開発 >Golang >カスタム アンマーシャラーを使用して Go で動的キーを使用して YAML を解析する方法

カスタム アンマーシャラーを使用して Go で動的キーを使用して YAML を解析する方法

Susan Sarandon
Susan Sarandonオリジナル
2024-11-04 06:34:01461ブラウズ

How to Parse YAML with Dynamic Keys in Go Using a Custom Unmarshaler?

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(&amp;params); err != nil {
        return err
    }
    var versions map[string]MajorVersion
    if err := unmarshal(&amp;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), &amp;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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。