Unmarshal yaml memetakan kunci dict kepada sifat struktur

WBOY
Lepaskan: 2024-02-09 15:40:29
ke hadapan
956 orang telah melayarinya

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

editor php Xigua hari ini memperkenalkan anda kepada teknik yang sangat berguna - membongkar YAML ke dalam kamus dan memetakan kunci kepada atribut struktur. YAML ialah format siri data ringan yang biasa digunakan untuk fail konfigurasi dan pertukaran data. Dengan menyahmarshall YAML, kami boleh menukarnya menjadi kamus, dan kemudian memetakan kunci kamus kepada sifat struktur, menjadikannya lebih mudah untuk kami melakukan operasi dan pemprosesan selanjutnya dalam kod. Teknik ini sangat berguna apabila berurusan dengan fail konfigurasi atau memuatkan data daripada sumber data luaran Mari kita lihat kaedah pelaksanaan khusus!

Kandungan soalan

Saya ada mencari di sini untuk seketika tetapi tidak menemui jawapan yang sesuai:

Saya cuba menyahmarshal kunci dict yaml pada atribut struct dan bukannya kunci yang dipetakan. Memandangkan yaml ini

commands:
    php:
        service: php
        bin: /bin/php
    node:
        service: node
        bin: /bin/node
Salin selepas log masuk

Saya dapat membongkarnya menjadi struktur seperti ini:

type config struct {
    commands map[string]struct {
        service string
        bin     string
    }
}
Salin selepas log masuk

Tetapi bagaimana saya boleh menyahbinanya menjadi struktur seperti ini:

type Config struct {
    Commands []struct {
        Name    string    // <-- this should be key from the yaml (i.e. php or node)
        Service string
        Bin     string
    }
}
Salin selepas log masuk

Terima kasih terlebih dahulu atas bantuan anda

Penyelesaian

Anda boleh menulis unmarshaller tersuai seperti ini (on the go playground):

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)
    }
}
Salin selepas log masuk

Saya telah membahagikan data arahan kepada commandnamedcommand 以使代码更简单,因为您只需调用 decode 即可提供嵌入的 command nilai struct. Jika semuanya berada dalam struct yang sama, anda perlu memetakan kekunci secara manual ke medan struct.

Atas ialah kandungan terperinci Unmarshal yaml memetakan kunci dict kepada sifat struktur. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan