Heim > Backend-Entwicklung > Golang > Wie analysiere ich YAML mit dynamischen Schlüsseln in Go mithilfe eines benutzerdefinierten Unmarshalers?

Wie analysiere ich YAML mit dynamischen Schlüsseln in Go mithilfe eines benutzerdefinierten Unmarshalers?

Susan Sarandon
Freigeben: 2024-11-04 06:34:01
Original
452 Leute haben es durchsucht

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

YAML mit dynamischem Schlüssel in Go analysieren

Dieses Problem tritt auf, wenn YAML-Dateien mit Schlüsseln analysiert werden, die je nach den vom Benutzer definierten API-Versionen variieren können . Der Benutzer kann Versionen nach Bedarf weglassen oder anordnen (z. B. V0, V2, V5).

Ursprünglicher Ansatz mit Umgebungsstruktur

Der anfängliche Ansatz beinhaltet das Parsen der YAML als eine Umgebungsstruktur. Der eigentliche Typ der geparsten Daten ist jedoch „map[string]Environment“.

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

Um dieses Problem zu beheben, benötigen wir einen benutzerdefinierten Unmarshaler.

Benutzerdefinierter Unmarshaler für die Umgebung

Wir erstellen eine benutzerdefinierte Unmarshaler-Methode für den Umgebungstyp, die sowohl die statischen als auch die dynamischen Schlüssel analysiert.

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

Geänderte Analyse und Ausgabe

Wir können jetzt unseren Parsing-Code ändern, um die dynamischen Schlüssel zu verarbeiten und letztendlich die gewünschte Datenstruktur zurückzugeben.

Geänderte Hauptfunktion

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

Ausgabe

Die Ausgabe spiegelt nun die erwartete Datenstruktur wider, wobei die dynamischen Schlüssel entsprechend analysiert werden.

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

Das obige ist der detaillierte Inhalt vonWie analysiere ich YAML mit dynamischen Schlüsseln in Go mithilfe eines benutzerdefinierten Unmarshalers?. 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