Maison  >  Article  >  développement back-end  >  yaml utilise plusieurs clés de mappage complexes comme structure

yaml utilise plusieurs clés de mappage complexes comme structure

WBOY
WBOYavant
2024-02-09 19:12:09700parcourir

yaml 将多个复杂的映射键作为一个结构体

L'éditeur PHP Youzi a mentionné un concept important lors de l'introduction de YAML, qui consiste à utiliser plusieurs clés de mappage complexes comme structure. YAML est un format utilisé pour représenter la sérialisation des données et est hautement lisible par l'homme. Dans YAML, vous pouvez utiliser des structures pour combiner plusieurs paires clé-valeur en un tout, rendant la structure des données plus claire et plus facile à comprendre. Cette approche peut aider les développeurs à mieux organiser et gérer des données complexes et à améliorer la lisibilité et la maintenabilité du code. Dans les applications pratiques, les structures sont une fonctionnalité très utile, jetons-y un coup d'œil !

Contenu de la question

Je souhaite désorganiser une clé de carte complexe dans une structure :

yaml

unf:
    item_meta:
      source:
        ? id: "aa"
          name: "bb"
        : "some value"

Structure

type source struct {
    id     string `yaml:"id"`
    name   string `yaml:"name"`
}

Tout fonctionne comme prévu jusqu'à ce que j'ajoute une autre clé :

yaml 2

unf:
    item_meta:
      source:
        ? id: "012"
          name: "bill"
        : "some value"
        ? id: "066"
          name: "bob"
        : "another value"

J'ai eu une erreur

"line xxx: mapping key "" already defined at line xxx"

J'ai décidé d'utiliser un pseudo :

yaml 3

unf:
    item_meta:
      aliases:
        - bill: &alias_bill
          id: "012"
          name: "Bill"
        - bob: &alias_bob
          id: "066"
          name: "Bob"
      source:
        ? *alias_bill
        : "some value"
        ? *alias_bob
          name: "Bob"
        : "another value"

Problème résolu ! Mais nous utilisons le hiera server dans la pile hiera server 并且 hiera et hiera renvoie le contenu du fichier de configuration remplacé, donc je me suis retrouvé avec la version yaml 2.

p> hiera 服务器 Des idées sur la façon de résoudre ce problème ? Impossible de configurer

.

Aller au terrain de jeu

Solution

Ma solution est principalement basée sur cette question

@larsks

L'idée est de trouver des nœuds avec des clés de carte en double et de créer des valeurs personnalisées à partir du nœud de valeur du nœud de carte. 🎜
func fixYamlNode(node *yaml.Node) {
    if node.Kind == yaml.MappingNode {
        length := len(node.Content)

        for i := 0; i < length; i += 2 {
            nodes := make([]*yaml.Node, 0)
            nodes = append(nodes, node.Content[i])
            for j := i + 2; j < length; j += 2 {
                nj := node.Content[j]
                if nodes[0].Kind == nj.Kind && nodes[0].Value == nj.Value {
                    nodes = append(nodes, nj)
                }
            }
            if len(nodes) == 1 {
                continue
            }

            fillMapValue(nodes)
        }

        for i := 1; i < length; i += 2 {
            valueNode := node.Content[i]
            fixYamlNode(valueNode)
        }
    }
}

func fillMapValue(nodes []*yaml.Node) {
    for _, node := range nodes {
        length := len(node.Content)
        for i := 0; i < length; i += 2 {
            node.Value = fmt.Sprintf("%s %s", node.Value, node.Content[i+1].Value)
        }
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer