Maison >développement back-end >Golang >Comment analyser YAML avec des clés dynamiques dans Go à l'aide d'un Unmarshaler personnalisé ?

Comment analyser YAML avec des clés dynamiques dans Go à l'aide d'un Unmarshaler personnalisé ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-04 06:34:01453parcourir

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

Analyse de YAML avec Dynamic Key dans Go

Ce problème survient lors de l'analyse de fichiers YAML avec des clés qui peuvent varier en fonction des versions d'API définies par l'utilisateur . L'utilisateur peut omettre ou organiser les versions selon ses besoins (par exemple, V0, V2, V5).

Approche originale avec structure d'environnement

L'approche initiale consiste à analyser le YAML comme une structure d'environnement. Cependant, le type réel des données analysées est map[string]Environment.

<code class="go">type Environment struct {
  SkipHeaderValidation  bool        `yaml:"skip-header-validation"`
  Version               map[string]MajorVersion
}</code>

Pour résoudre ce problème, nous avons besoin d'un Unmarshaler personnalisé.

Unmarshaler personnalisé pour l'environnement

Nous créons une méthode Unmarshaler personnalisée pour le type d'environnement qui analyse à la fois les clés statiques et dynamiques.

<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>

Analyse et sortie modifiées

Nous pouvons maintenant modifier notre code d'analyse pour gérer les clés dynamiques et finalement renvoyer la structure de données souhaitée.

Fonction principale modifiée

<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>

Sortie

La sortie reflétera désormais la structure de données attendue avec les clés dynamiques analysées en conséquence.

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,
            },
        },
    },
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn