Heim > Artikel > Backend-Entwicklung > Entmarshalieren Sie die Yaml-Zuordnung von Diktatschlüsseln zu Struktureigenschaften
php-Editor Xigua stellt Ihnen heute eine sehr nützliche Technik vor – das Unmarshalling von YAML in ein Wörterbuch und die Zuordnung von Schlüsseln zu Strukturattributen. YAML ist ein leichtes Datenserialisierungsformat, das häufig für Konfigurationsdateien und den Datenaustausch verwendet wird. Indem wir YAML entmarshallen, können wir es in ein Wörterbuch umwandeln und dann die Wörterbuchschlüssel strukturellen Eigenschaften zuordnen, was es uns erleichtert, weitere Vorgänge und Verarbeitungen im Code durchzuführen. Diese Technik ist sehr nützlich, wenn Sie mit Konfigurationsdateien arbeiten oder Daten aus externen Datenquellen laden. Schauen wir uns die spezifische Implementierungsmethode an!
Ich habe hier eine Weile gesucht, aber keine passende Antwort gefunden:
Ich versuche, einen Yaml-Diktschlüssel auf die Attribute einer Struktur statt auf zugeordnete Schlüssel zu verteilen. Angesichts dieses Yaml
commands: php: service: php bin: /bin/php node: service: node bin: /bin/node
Ich konnte es in eine Struktur wie diese entmarshalieren:
type config struct { commands map[string]struct { service string bin string } }
Aber wie kann ich es in eine Struktur wie diese dekonstruieren:
type Config struct { Commands []struct { Name string // <-- this should be key from the yaml (i.e. php or node) Service string Bin string } }
Vielen Dank im Voraus für Ihre Hilfe
Sie können einen benutzerdefinierten Unmarshaller wie diesen schreiben (auf dem Spielplatz für unterwegs):
package main import ( "fmt" "gopkg.in/yaml.v3" ) var input []byte = []byte(` commands: php: service: php bin: /bin/php node: service: node bin: /bin/node `) type Command struct { Service string Bin string } type NamedCommand struct { Command Name string } type NamedCommands []NamedCommand type Config struct { Commands NamedCommands } func (p *NamedCommands) UnmarshalYAML(value *yaml.Node) error { if value.Kind != yaml.MappingNode { return fmt.Errorf("`commands` must contain YAML mapping, has %v", value.Kind) } *p = make([]NamedCommand, len(value.Content)/2) for i := 0; i < len(value.Content); i += 2 { var res = &(*p)[i/2] if err := value.Content[i].Decode(&res.Name); err != nil { return err } if err := value.Content[i+1].Decode(&res.Command); err != nil { return err } } return nil } func main() { var f Config var err error if err = yaml.Unmarshal(input, &f); err != nil { panic(err) } for _, cmd := range f.Commands { fmt.Printf("%+v\n", cmd) } }
Ich habe die Befehlsdaten in command
和 namedcommand
以使代码更简单,因为您只需调用 decode
即可提供嵌入的 command
Werte der Struktur aufgeteilt. Wenn sich alles in derselben Struktur befindet, müssen Sie die Schlüssel manuell den Strukturfeldern zuordnen.
Das obige ist der detaillierte Inhalt vonEntmarshalieren Sie die Yaml-Zuordnung von Diktatschlüsseln zu Struktureigenschaften. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!