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
Susan SarandonOriginal
2024-11-04 06:34:01453Durchsuche

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>

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>

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>

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

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!

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