Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Unmarshal yaml memetakan kunci dict kepada sifat struktur

Unmarshal yaml memetakan kunci dict kepada sifat struktur

WBOY
WBOYke hadapan
2024-02-09 15:40:29953semak imbas

解组 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

Saya dapat membongkarnya menjadi struktur seperti ini:

type config struct {
    commands map[string]struct {
        service string
        bin     string
    }
}

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

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

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam