Maison  >  Article  >  développement back-end  >  Comment analyser YAML avec des clés dynamiques dans Go ?

Comment analyser YAML avec des clés dynamiques dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-04 02:28:29203parcourir

How to Parse YAML with Dynamic Keys in Go?

Analyse dynamique des clés en YAML avec Golang

Introduction

YAML (YAML n'est pas Markup Language) est un format de sérialisation de données largement utilisé qui permet une représentation flexible des données. Cependant, l'analyse des fichiers YAML avec des clés dynamiques (c'est-à-dire des clés qui peuvent varier) pose un défi dans Go car le langage s'appuie fortement sur des structures typées statiquement.

Description du problème

Vous disposez d'un fichier YAML dont les clés représentent différentes versions (par exemple, V1, V2, V3). L'utilisateur peut spécifier les versions qu'il prend en charge, et les clés peuvent ne pas être dans l'ordre ou ignorer les versions. Vous souhaitez analyser ce fichier YAML dans une structure Go, mais les champs de la structure doivent correspondre aux clés dynamiques.

Approche incorrecte

Au départ, vous avez tenté d'analyser le YAML fichier dans une structure d'environnement, en s'attendant à ce que les clés soient présentes au niveau racine. Cependant, le type réel de l'élément racine est une carte de chaînes (représentant les noms d'environnement) vers les structures d'environnement.

Solution

Pour analyser YAML avec des clés dynamiques, vous vous devez utiliser une méthode UnmarshalYAML personnalisée sur la structure qui analysera les clés et construira la structure correcte. Dans ce cas, la structure Environment nécessite une méthode UnmarshalYAML pour désorganiser la racine sous forme de carte, puis analyser les environnements individuels.

Exemple de code

Voici un exemple de Méthode UnmarshalYAML personnalisée pour la structure Environment :

<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 {
        // Here we expect an error because a boolean cannot be converted to a MajorVersion
        if _, ok := err.(*yaml.TypeError); !ok {
            return err
        }
    }
    e.SkipHeaderValidation = params.SkipHeaderValidation
    e.Versions = versions
    return nil
}</code>

Cette méthode démarshale d'abord le champ booléen SkipHeaderValidation. Ensuite, il tente de regrouper le reste des données dans une carte des noms de versions vers les structures MajorVersion. Cependant, comme les données non marshalées sont un mélange de structures booléennes et MajorVersion, une erreur yaml.TypeError sera générée. Le code ignore cette erreur et attribue la carte des versions non marshalées au champ Versions de la structure Environnement.

Exemple d'utilisation

Avec la méthode UnmarshalYAML personnalisée en place, vous pouvez maintenant, désassemblez correctement les données YAML :

<code class="go">var e map[string]Environment
if err := yaml.Unmarshal([]byte(data), &e); err != nil {
    fmt.Println(err.Error())
}
fmt.Printf("%#v\n", e)</code>

Cela produira le résultat suivant :

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

Cela démontre l'analyse réussie du fichier YAML avec des clés dynamiques dans une structure Go.

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