Maison > développement back-end > Golang > le corps du texte

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

Susan Sarandon
Libérer: 2024-11-04 06:34:01
original
386 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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,
            },
        },
    },
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!