Heim >Backend-Entwicklung >Golang >Entmarshalieren Sie die Yaml-Zuordnung von Diktatschlüsseln zu Struktureigenschaften

Entmarshalieren Sie die Yaml-Zuordnung von Diktatschlüsseln zu Struktureigenschaften

WBOY
WBOYnach vorne
2024-02-09 15:40:29979Durchsuche

解组 yaml 将 dict 键映射到结构属性

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!

Frageninhalt

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

Problemumgehung

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 commandnamedcommand 以使代码更简单,因为您只需调用 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen