Heim >Backend-Entwicklung >Golang >Wie analysiere ich YAML mit dynamischen Schlüsseln in Go mithilfe eines benutzerdefinierten Unmarshalers?
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(&params); err != nil { return err } var versions map[string]MajorVersion if err := unmarshal(&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), &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!