Wie analysiere ich YAML mit dynamischen Schlüsseln in Go?

Linda Hamilton
Freigeben: 2024-11-04 02:28:29
Original
282 Leute haben es durchsucht

How to Parse YAML with Dynamic Keys in Go?

Dynamisches Schlüsselparsen in YAML mit Golang

Einführung

YAML (YAML ist nicht Markup Language) ist ein weit verbreitetes Datenserialisierungsformat, das eine flexible Datendarstellung ermöglicht. Das Parsen von YAML-Dateien mit dynamischen Schlüsseln (d. h. Schlüsseln, die variieren können) stellt in Go jedoch eine Herausforderung dar, da die Sprache stark auf statisch typisierten Strukturen basiert.

Problembeschreibung

Sie haben eine YAML-Datei, in der die Schlüssel verschiedene Versionen darstellen (z. B. V1, V2, V3). Der Benutzer kann angeben, welche Versionen er unterstützt. Die Schlüssel sind möglicherweise nicht in der richtigen Reihenfolge oder es werden Versionen übersprungen. Sie möchten diese YAML-Datei in eine Go-Struktur analysieren, aber die Felder der Struktur müssen mit den dynamischen Schlüsseln übereinstimmen.

Falscher Ansatz

Zunächst haben Sie versucht, die YAML zu analysieren Datei in eine Umgebungsstruktur und erwartet, dass die Schlüssel auf der Stammebene vorhanden sind. Der tatsächliche Typ des Stammelements ist jedoch eine Zuordnung von Zeichenfolgen (die Umgebungsnamen darstellen) zu Umgebungsstrukturen.

Lösung

Um YAML mit dynamischen Schlüsseln zu analysieren, müssen Sie Sie müssen eine benutzerdefinierte UnmarshalYAML-Methode für die Struktur verwenden, die die Schlüssel analysiert und die richtige Struktur erstellt. In diesem Fall erfordert die Umgebungsstruktur eine UnmarshalYAML-Methode, um den Stamm als Karte zu entmarshalieren und dann die einzelnen Umgebungen zu analysieren.

Codebeispiel

Hier ist ein Beispiel für a Benutzerdefinierte UnmarshalYAML-Methode für die Umgebungsstruktur:

<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>
Nach dem Login kopieren

Diese Methode entmarshallt zunächst das boolesche Feld SkipHeaderValidation. Anschließend wird versucht, den Rest der Daten in eine Zuordnung von Versionsnamen zu MajorVersion-Strukturen zu entmarshalieren. Da es sich bei den nicht gemarshallten Daten jedoch um eine Mischung aus booleschen Werten und MajorVersion-Strukturen handelt, wird ein yaml.TypeError ausgelöst. Der Code ignoriert diesen Fehler und weist die nicht gemarshallte Versionszuordnung dem Feld „Versionen“ der Umgebungsstruktur zu.

Beispielverwendung

Mit der benutzerdefinierten UnmarshalYAML-Methode ist das möglich Entpacken Sie nun die YAML-Daten korrekt:

<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>
Nach dem Login kopieren

Dies erzeugt die folgende Ausgabe:

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,
            },
        },
    },
}
Nach dem Login kopieren

Dies demonstriert das erfolgreiche Parsen der YAML-Datei mit dynamischen Schlüsseln in eine Go-Struktur.

Das obige ist der detaillierte Inhalt vonWie analysiere ich YAML mit dynamischen Schlüsseln in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage